2016-10-05 104 views
0

我的应用程序允许用户通过选择图像上传单个图像:@Html.TextBoxFor(m => m.Image, new {type = "file"})。如果有任何验证错误,我将丢失其选定的文件。因此,我通过If(!ModelState.IsValid)代码块需要临时保存:传回HttpPostedFileBase从视图→控制器→返回查看

public ActionResult Create(MyModel model) { 
    if (!ModelState.IsValid) 
    { 
     if(model.Image != null && model.Image.ContentLength > 0) { 
     var displayName = Path.GetFileName(model.Image.FileName); 
     var fileExtension = Path.GetExtension(displayName); 
     var fileName = string.Format("{0}{1}", Guid.NewGuid(), fileExtension); 
     var path = Path.Combine(Server.MapPath("~/App_Data/Files"), fileName); 
     model.Image.SaveAs(path); 
     model.displayName = displayName; 
     model.FilePath = path; 
     return View(model); 
    } 
} 

我在视图中使用@Html.HiddenFor(m => m.FilePath)

model.Image类型是HttpPostedFileBase。我必须以某种方式重新获得用户选择图像HttpPostedFileBase!ModelState.IsValid,以便能够将其保存在数据库中。任何机会传回@Html.TextBoxFor(m => m.Image, new {type = "file"})内的信息?

How I later convert HttpPostedFileBase to byte[], in order to store image-data in database.

我不知道怎么跟我有工具做到这一点。

编辑:模型属性:

public string displayName { get; set; } 
public string FilePath { get; set; } 
public HttpPostedFileBase Image { get; set; } 
+1

不,你不能考绩一个属性public byte[] Image { get; set; }(M => m.Image,新{TYPE =“文件”})'出于安全原因。 (参考[MVC文件上传保存选定的文件](http://stackoverflow.com/questions/29261726/mvc-file-upload-save-selected-file))。你已经有一个隐藏的输入文件路径,所以如果'ModelSta te'现在在重新提交后有效,然后根据隐藏输入的值获取已保存的文件,并将其转换为字节数组,如果您想将其保存在数据库 –

+1

使用'byte [] bytes = System.IO.File.ReadAllBytes(model.FilePath);' –

回答

1

你不能为安全起见文件输入的值(它只能由用户选择在浏览器中的文件中设置)。

在视图中,您将需要一个条件检查显示文件名和路径(最初这将是null

@if (Model.displayName != null) 
{ 
    <div>@Model.displayName</div> // let the user know that its been uploaded 
    @Html.HiddenFor(m => m.FilePath) 
} 
控制器

然后,如果ModelState是有效的,你需要条件的检查值为FilePath。如果您提交并且ModelState无效,则FilePath的值现在将包含用户重新提交时保存文件的路径。但在ModelState有效初始提交的情况下,FilePath值将是null

您控制器代码需要(注意,这个假设MyModel实际上是一个视图模型,你必须包含相关的数据模型对于早在`Html.TextBoxFor文件保存在数据库中的表

public ActionResult Create(MyModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     .... // code as above to save temporary file and return the view 
    } 
    // Initialize an instance of your data model 
    var dataModel = new .... // assumes this contains a property byte[] Image 
    if (model.FilePath == null) 
    { 
     // The code above has never run so read from the HttpPostedFileBase property 
     if(model.Image != null && model.Image.ContentLength > 0) { 
     { 
      MemoryStream target = new MemoryStream(); 
      model.Image.InputStream.CopyTo(target); 
      dataModel.Image = target.ToArray(); 
     } 
    } 
    else 
    { 
     // Read from the temporary file 
     dataModel.Image = System.IO.File.ReadAllBytes(filename); 
     .... // Delete the temporary file 
    } 
    // Map other properties of your view model to the data model 
    // Save and redirect 
} 
相关问题