2

asp.net mc3 プロジェクトで画像とその他の情報をデータベースに保存したいと考えています。以前に画像をデータベースに保存したことがありますが、うまくいきました。私のコントローラーの私のコードはこれでした:

public ActionResult savetodb()
{
    if (Request.Files.Count > 0 && Request.Files[0] != null)
        {
             HttpPostedFileBase file = Request.Files[0];
             var path = Path.Combine(Server.MapPath("~/Content/Image"), file.FileName); 
             file.SaveAs(path);
             byte[] buffer = System.IO.File.ReadAllBytes(path);
             myAd.AdImage = buffer;
             StoreDb.AddToAds(myAd);
             StoreDb.SaveChanges();
        }
        return View();      
    }
}

今、テーブルを変更し、画像以外の情報をデータベースに保存したいと考えています。今私のコードは次のようになります:

 public ActionResult savetodb(AdvertiseView model)
 {
     if (Request.Files.Count > 0 && Request.Files[0] != null)
     {
         HttpPostedFileBase file = Request.Files[0];
         var path = Path.Combine(Server.MapPath("~/Content/Image"), file.FileName);
         file.SaveAs(path);
         byte[] buffer = System.IO.File.ReadAllBytes(path);
         myAd.AdImage = buffer;
     }
     myAd.AdTitle = model.AdTitle;
     myAd.AdContext = model.context;
     myAd.AdScope = model.Scope;
     storedb.AddToAds(myAd);
     storedb.SaveChanges();
     return View();
}

その他の情報には問題ありませんが、画像が保存できません。という事は承知しています

Request.Files.Count

0 を返します。今何をすべきかわかりません。誰でも私を助けてもらえますか?どうもありがとう。

4

3 に答える 3

4

ビューモデルを使用します。

最初にドメイン モデルがあるとします。

public class MyDomainModel
{
    public byte[] AdImage { get; set; }
    public string Description { get; set; }
}

次に、ビュー モデルを定義します。

public class MyViewModel
{
    [Required]
    public HttpPostedFileBase File { get; set; }

    [DataType(DataType.MultilineText)]
    public string Description { get; set; }
}

コントローラー:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

        // TODO: move this mapping logic into a 
        // mapping layer to avoid polluting the controller
        // I would recommend AutoMapper for this purpose
        // http://automapper.org/
        using (var stream = new MemoryStream())
        {
            model.File.InputStream.CopyTo(stream);
            var image = stream.ToArray();
            var domainModel = new MyDomainModel
            {
                AdImage = image,
                Description = model.Description
            };

            // TODO: persist the domain model by passing it to a method
            // on your DAL layer
        }

        return Content("Thanks for submitting");
    }
}

推奨されるリファクタリングが完了したら:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

        MyDomainModel domainModel = Mapper.Map<MyViewModel, MyDomainModel>(model);

        // TODO: persist the domain model by passing it to a method
        // on your DAL layer

        return Content("Thanks for submitting");
    }
}

最後に、ユーザーがファイルをアップロードできるようにするビュー:

@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <div>
        @Html.LabelFor(x => x.Description)
        @Html.EditorFor(x => x.Description)
    </div>

    <div>
        @Html.LabelFor(x => x.File)
        @Html.TextBoxFor(x => x.File, new { type = "file" })
        @Html.ValidationMessageFor(x => x.File)
    </div>    
    <button type="submit">OK</button>
}
于 2012-06-10T18:41:32.270 に答える
2

HttpPostedFileBaseアクションのパラメーターとして使用します。

1 つのファイルのみを送信する場合は、これを使用します。複数を許可する場合は、パラメーターIEnumerable<HttpPostedFileBase> filesとして使用する必要があります。

public ActionResult savetodb(HttpPostedFileBase file)
{
    if(file != null)
    {
        var path = Path.Combine(Server.MapPath("~/Content/Image"), file.FileName);
        file.SaveAs(path);
        byte[] buffer = System.IO.File.ReadAllBytes(path);
        myAd.AdImage = buffer;
        StoreDb.AddToAds(myAd);
        StoreDb.SaveChanges();
    }
    return View();      
}

また、フォームがビューで適切に構築されていることを確認する必要があります

@using (Html.BeginForm("ActionName", "ControllerName", FormMethod.Post, new { enctype = "multipart/form-data" })) {
....
}

また、既定では、ブラウザーのファイル サイズのアップロード制限は 4 MB です。それよりも大きなものをアップロードする場合は、web.config ファイルで設定を構成する必要があります。

于 2012-06-10T18:16:32.387 に答える
1

ビュー モデルにプロパティを追加して、このファイルを取得します。

public class AdvertiseView
{
    ...    
    public HttpPostedFileBase NameOfFileInput;
    ....
}

したがって、ファイルをモデルのプロパティとして取得できます。

if (myAd.NameOfFileInput != null)
{
    var path = Path.Combine(Server.MapPath("~/Content/Image"), myAd.NameOfFileInput.FileName);
    myAd.NameOfFileInput.SaveAs(path);
    byte[] buffer = System.IO.File.ReadAllBytes(path);
    myAd.AdImage = buffer;
}

もちろんAdImage、同じタイプの場合はバッファをコピーせずに、同じプロパティを使用して適切な場所に保存することができます。

于 2012-06-10T18:16:48.537 に答える