2

ファイルをデータベースに保存する方法と、可能であればそれを取得する方法を誰かが教えてくれませんか?私はまだこのC#とMVC 4に慣れていません.

モデル

 public partial class Assignment
{
    public Assignment()
    {
        this.CourseAvailables = new HashSet<CourseAvailable>();
    }



    public string AssignmentID { get; set; }
    public Nullable<System.DateTime> SubmissionDate { get; set; }
    public string Status { get; set; }
    [Range(0,100, ErrorMessage="Only Value between 0-100 is accepted.")]
    public Nullable<decimal> Mark { get; set; }
    public string Comments { get; set; }
    public byte[] FileLocation { get; set; }

    public virtual ICollection<CourseAvailable> CourseAvailables { get; set; }
}
}

コントロール

[HttpPost]
    public ActionResult Create(Assignment assignment)
    {

        if (ModelState.IsValid)
        {
            db.Assignments.Add(assignment);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(assignment);
    }

意見

@using(Html.BeginForm("Create","Assignment",FormMethod.Post,new {enctype="multipart/form-data"}))
{
...
<div class="editor-field">
    <%: Html.TextBoxFor(model => model.FileLocation, new { type="file"})%>
    <%: Html.ValidationMessageFor(model => model.FileLocation) %>
</div>
...
}
4

2 に答える 2

5

ここはもう少し加工が必要です。アップロードされたファイルはHttpPostedFileBaseではなくとして入ってくるので、次のように HttpPostedFileBase の InputStream からbyte[]を取得する必要があります。byte[]

[HttpPost]
public ActionResult Create(Assignment assignment)
{
    if(Request.Files != null && Request.Files.Count == 1)
    {
        var file = Request.Files[0];
        if (file != null && file.ContentLength > 0)
        {
            var content = new byte[file.ContentLength];
            file.InputStream.Read(content, 0, file.ContentLength);
            assignment.FileLocation = content;

            // the rest of your db code here
        }
    }
    return RedirectToAction("Create");    
}

PSそのモデルは疑わしいことにEntityオブジェクトのように見えます。Entity オブジェクトをモデルとして使用することは、非常に悪い考えです。中間モデルを作成し、それを使用して代わりにデータをレンダリングしてみてください。

編集

あなたの見解では、これを変更してください:

<%: Html.TextBoxFor(model => model.FileLocation, new { type="file"})%>

これに:

<input type="file" id="file" name="file" />

表示されるエラーは、モデル バインダーがページ上の FileLocation フィールド (HttpPostedFileBase タイプ) をモデルの FileLocation フィールド (byte[] タイプ) に誤ってバインドしようとしているためです。

于 2014-08-06T13:14:39.897 に答える
2

Asp.Net MVC ではHttpPostedFileBase、以下に示すように、アップロードされたファイルに使用する必要があります:-

[HttpPost]
public ActionResult Create(Assignment assignment, HttpPostedFileBase file)
{
  if (file != null)
        {
            int byteCount = file.ContentLength;   <---Your file Size or Length
            .............
            .............//You can store file in database//
        }
 return RedirectToAction("Create");    
}
于 2014-08-06T12:56:47.493 に答える