2

2つの異なるファイルを同じフォームの2つの異なるデータベースフィールドにアップロードしようとしています。

------------------------------------
reportid | name | image | template |
------------------------------------

これがテーブルルックです。だから私は画像とテンプレートにファイルをアップロードしたいと思います。私のモデル:

public class Report
{
    [Key]
    public int ReportID { get; set; }

    [Required]
    public string Name { get; set; }

    public byte[] Image { get; set; }

    public byte[] Template { get; set; }

}

コントローラのMyCreateメソッド:

public ActionResult Create(Report report, HttpPostedFileBase file, HttpPostedFileBase temp)
    {
        if (ModelState.IsValid)
        {
            if (file != null && file.ContentLength > 0)
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    file.InputStream.CopyTo(ms);
                    report.Image = ms.GetBuffer();
                }
            }

            if (temp != null && temp.ContentLength > 0)
            {
                using (MemoryStream ms1 = new MemoryStream())
                {
                    temp.InputStream.CopyTo(ms1);
                    report.Template = ms1.GetBuffer();
                }
            }
            db.Reports.Add(report);
            db.SaveChanges();
            db.Configuration.ValidateOnSaveEnabled = true;
            return RedirectToAction("Index");  
        }

そしてアップロードに関する見解の一部:

<div class="editor-label">
   <%:Html.LabelFor(model => model.Image) %>
</div>
<div class="editor-field">
   <input type="file" id="fuImage" name="file" />
</div>
<div class="editor-label">
   <%:Html.Label("Template") %>
</div>
<div class="editor-field"> 
   <input type="file" id="temp" name="temp"/>
</div>
<p>
   <input type="submit" value="Create" />
</p>

IEnumerable<HttpPostedFileBase> files別のフィールドに保存する必要があるため、メソッドのパラメーターとして使用できないため、これでかなり行き詰まっていCreateますか?これにどのようにアプローチすればよいですか?助けてください:S

注:画像のアップロードは正常に機能します。

4

1 に答える 1

6

なぜ使用しないのIEnumerable<HttpPostedFileBase>ですか?こんな感じで使えます。

[HttpPost] 
public ActionResult Create(Report report, IEnumerable<HttpPostedFileBase> files)
{
  if (ModelState.IsValid)
  {
    //Let's take first file
     if(files.ElementAt(0)!=null)
     { 
       var file1=files.ElementAt(0);
       if (file1!= null && file1.ContentLength > 0)
       {
          //do processing of first file
       }
     }

     //Let's take the second one now.
     if(files.ElementAt(1)!=null)
     {
       var temp =files.ElementAt(1);
       if (temp!= null && temp.ContentLength > 0)
       {
          //do processing of second file here
       }
     }
  }
  //Do your code for saving the data. 
  return RedirectToAction("Index");
}

EDIT : EDIT でビュー マークアップを確認した後。

ファイル入力要素の名前は、アクション メソッドのパラメーター名と同じにする必要があります。(filesこの例では)

@using (Html.BeginForm("Create", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
  <b>File 1</b>   
  <input type="file" name="files" id="file1" />
  <b>File 2</b>
  <input type="file" name="files" id="file2" />
  <input type="submit"  />
}

このコードは、コレクションから最初の 2 つのエントリのみを読み取ることを前提としています。必要なファイルは 2 つだけなので、インデックスをハードコーディングしました。

Phil は、それについて非常にうまく説明している素晴らしいブログ投稿を持っています。

于 2012-06-27T12:12:01.227 に答える