我正在开发一个基于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会提示您:
点击此消息后,如果您点击"是,"文档打开,整个文档就在那里。没有损坏的数据,并且所有内容都按照预期的格式进行了格式化。
如果我们只将文档另存为原始文档名称,则此错误不存在。通常我们会这样做,但这是一个面向客户的大型应用程序,允许用户自己上传文档。如果公司A上传名为" Test.docx"的文档,则可能会出现问题。 B公司还上传了一份名为" Test.docx"因此会覆盖公司A的文件。因此,重新命名文件。
我们如何防止此错误发生?
答案 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;
}
}
希望这有助于将来的其他人(等待其他人体验过这一点)。