【发布时间】: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