如何在视图返回上保留HttpPostedFileBase

时间:2015-11-25 01:48:28

标签: c# asp.net-mvc razor httppostedfilebase

我有以下型号:

    int upperCount = 0;
    int lowerCount = 0;
    Scanner sc = new Scanner(System.in);
    String w = sc.nextLine();
    for(int i = 0; i < w.length(); i++){
        if(Character.isUpperCase(w.charAt(i))){
            upperCount++;
        }else{
            lowerCount++;
        }
    }
    System.out.println("Upper Counts are "+upperCount+" lower counts are "+lowerCount);

查看:

public string Content { get; set; }
public HttpPostedFileBase LogoImageFile { get; set; }

当用户使用文件输入元素中的“选择文件”按钮从本地驱动器中选择照片时,图像将通过javascript显示在屏幕上(如果表单有效并且提交,图像将保存到服务器):

 @Html.EditorFor(model => model.Content, new { htmlAttributes = new { @class = "form-control" } })
 <div class="uploaded-img-wrapper hidden">
   <img class="img-thumbnail-md" title="logo image" alt="logo image" />
 </div>
 @Html.TextBoxFor(model => model.LogoImageFile, new { type = "file", @class = "image-upload" })

我对“内容”文本框进行了服务器端验证。如果服务器端验证失败并且if (input.files && input.files[0]) { var reader = new FileReader(); reader.onload = function (e) { var $wrapper = $(input).prev(); $wrapper.removeClass('hidden'); $wrapper.find('img').attr('src', e.target.result).removeAttr('title'); $(input).addClass('hidden'); } reader.readAsDataURL(input.files[0]); } 被调用,则文件输入中的图像将消失。任何人都知道如何在返回View时将文件保留在页面上?

1 个答案:

答案 0 :(得分:1)

我有两个问题的解决方案:

远程验证:

根据以下句子“我对内容文本框进行了服务器端验证”,在我看来,您可以使用远程验证来验证表单,而不是将表单发送到服务器。这个link可以帮助您使用远程验证(我建议这样做)。

临时商店

在此解决方案中,您必须使用启用了ajax的文件上载组件(例如this)将文件或文件发送到服务器。然后,您必须准备一个操作以接收文件并将其保存在临时存储器(如缓存或文件系统)中,并生成文件引用以恢复保存的文件,最后将文件引用返回给客户端。文件引用形式作为隐藏输入,从而每次发送表单时,发送文件引用而不是文件内容。当然应注意两点:

1)使用用户请求准备取消所选文件的操作

2)按文件参考

准备api以恢复临时文件

3)管理临时文件以确保它们不会填满您的存储空间(如果使用asp.net缓存作为临时存储空间,IIS本身会处理它)。 enter image description here

public ActionResult UploadTemporary(HttpPostedFileBase file)
{
    Guid reference = Guid.NewGuid();
    string extension = Path.GetExtension(file.FileName);
    string fullName= reference.ToString()+extension;
    var path = Path.Combine(Server.MapPath("~/Content/TempFiles/"), fullName);

    var data = new byte[file.ContentLength];
    file.InputStream.Read(data, 0, file.ContentLength);

    using (var sw = new FileStream(path, FileMode.Create))
    {
        sw.Write(data, 0, data.Length);
    }

    return Content(reference);
}

摘要

如果您在项目中遇到一些此需求案例,第一个解决方案既快捷又容易,但如果您遇到大量此案例,我建议您使用第二个解决方案。第二个解决方案是时间 - 消费但对批量处理文件的应用程序非常有用。