ASP.Net MVC Razor文件下载为损坏

时间:2018-01-12 19:26:12

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

我正在开发一个基于Razor的ASP.Net项目。我们使用formdata从客户端发布文档,需要根据上传者更改此文件的名称。我们有一个这样做的方法,你可以在这里看到:



var fileToSave = "";

if (filename != null) {
    fileToSave = '@ViewBag.CompName' + "-" + filename.name;
    fileToSave = fileToSave.replace(/\s+/g, '-');
}

var formData = new FormData();
formData.append("Document", filename, fileToSave);




这会使用正确的名称保存文档,例如"试验公司-test.docx"

当我下载文件并将其打开时,问题就存在了。为此目的,文档正确下载并具有适当大小的上传文件," test.docx"。

打开下载的文件时,Word会提示您:

We're sorry. We can't open the document because we found a problem with its contents.

按"确定"然后显示以下消息: Word found unreadable content in this document. Do you want to recover the contents of this document? If you trust the source of this document, click Yes.

点击此消息后,如果您点击"是,"文档打开,整个文档就在那里。没有损坏的数据,并且所有内容都按照预期的格式进行了格式化。

如果我们只将文档另存为原始文档名称,则此错误不存在。通常我们会这样做,但这是一个面向客户的大型应用程序,允许用户自己上传文档。如果公司A上传名为" Test.docx"的文档,则可能会出现问题。 B公司还上传了一份名为" Test.docx"因此会覆盖公司A的文件。因此,重新命名文件。

我们如何防止此错误发生?

1 个答案:

答案 0 :(得分:0)

回来回答这个问题。事实证明,我忘记了将文件大小添加到下载信息中,因此在下载时它并不知道该文件应该有多大。我们只需添加以下代码行:

Response.AddHeader("Content-Length", file.Length.ToString());

所以要一起关闭所有内容,这就是最终下载功能的样子:

    public void DownloadCompanyDoc(int id)
    {
        try
        {
            var getFile = rep.GetCompanyDocById(id);
            var path = Path.Combine(HostingEnvironment.MapPath("~/Documents/CompanyDocs"), getFile);
            FileInfo file = new FileInfo(path);

            if (file.Exists)
            {
                Response.Clear();

                Response.AppendHeader("content-disposition", "attachment; filename=" + getFile);
                Response.AddHeader("Content-Length", file.Length.ToString());
                Response.ContentType = System.Net.Mime.MediaTypeNames.Application.Octet;
                Response.WriteFile(path);
                Response.TransmitFile(path);
                Response.Flush();
                Response.End();
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

希望这有助于将来的其他人(等待其他人体验过这一点)。