【问题标题】:ASP.Net MVC Razor Document Downloading as CorruptASP.Net MVC Razor 文档下载为损坏
【发布时间】:2018-01-12 19:26:12
【问题描述】:

我正在开发一个基于 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-Company-test.docx"

当我去下载文件并打开它时,问题就存在了。该文档可以正确下载,并且具有上传文件的适当大小,为此目的,“test.docx”。

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

按“确定”然后显示以下消息:

在此消息之后,如果您单击“是”,文档将打开并且整个文档都在那里。没有损坏的数据,并且所有内容都按照应有的格式进行了格式化。

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

我们怎样才能防止这个错误发生?

【问题讨论】:

  • 错误的细节说明了什么?
  • @I.R.R. “文件已损坏,无法打开。”
  • 通常您将文档保存到包含Guid 和文件扩展名作为文件名的文件服务器(并将该路径和文件名(用于显示目的)保存在数据库中。或者您还可以为每个公司创建单独的文件夹(但仍然存在公司可能会上传多个具有相同文件名的文件的风险)
  • @StephenMuecke 我也处理过。在我们的数据库端,我们存储文件名“fileToSave”。然后根据上传的内容保存在文件夹中。如果是公司级别、位置级别、物料级别或位置物料级别。编辑:(意外按下回车)var fileToSave = HttpContext.Current.Request.Files["Document"]; if (id == 0) { var path = Path.Combine(HostingEnvironment.MapPath("~/Documents/MaterialDocs"), fileToSave.FileName); fileToSave.SaveAs(path); return "success";

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


【解决方案1】:

回来回答这个问题。原来我忘记将文件大小添加到下载信息中,所以在下载时它不知道文件应该有多大。我们只需要添加以下代码行:

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;
        }
    }

希望这对将来的其他人有所帮助(等待其他人经历过这种情况)。

【讨论】:

  • 这对我来说是今天的救命稻草(使用 IHttpActionResults 和 Web API v2)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 2018-12-06
  • 1970-01-01
  • 2015-07-14
相关资源
最近更新 更多