提问人:Yogi 提问时间:6/8/2023 更新时间:6/10/2023 访问量:153
用于上载 .docx 文档时出现 System.IO.File.WriteAllBytes 问题
System.IO.File.WriteAllBytes issue when used for uploading .docx document
问:
我有这样的代码来接受从 Web UI 上传的文件:
byte[] addBytes = new byte[] { 45, 45 };
var uploadedFiles = this.HttpContext.Request.Form.Files;
foreach (var uploadedFile in uploadedFiles)
{
filename = uploadedFile.FileName;
fileFullPath = Path.Combine(uploadFolderName, filename);
using (Stream bodyStream = uploadedFile.OpenReadStream())
{
byte[] contents = await bodyStream.ToByteArrayAsync((int)this.HttpContext.Request.ContentLength);
if (filename.ToLower().EndsWith(".docx"))
{
contents.Append<byte>(addBytes[0]);
contents.Append<byte>(addBytes[1]);
}
System.IO.File.WriteAllBytes(fileFullPath, contents);
}
}
addBytes 应该可以解决问题,但它没有任何区别。当我尝试打开 docx 文档时,仍然提示我以下消息:“Word 在.....中发现不可读的内容是否要恢复此文档的内容?如果您信任此文档的来源,请单击“是”。
有谁知道如何在不跳闸该消息的情况下使 WriteAllByte 工作?此代码适用于其他格式,甚至某些 .docx 也可以正常打开。只有大多数 .docx 已损坏
答:
4赞
Etienne de Martel
6/8/2023
#1
this.HttpContext.Request.ContentLength
是整个请求的长度。假设这是一个请求,它比文件的大小大,因为可能有多个文件,并且它还包括边界和每个部分的标题等内容。若要获取文件的大小,请使用样式文件的属性。multipart/form-data
Length
但实际上,这是不必要的。一般来说,除非你已经有一个字节数组作为输入,否则我不喜欢使用,因为这意味着你必须将源数据复制到数组中并将其保存在内存中,这对于大文件来说是不利的。只需使用 a 并直接复制数据,使用 的方法。File.WriteAllBytes
FileStream
IFormFile
CopyToAsync
foreach (var uploadedFile in uploadedFiles)
{
var fullPath = Path.Combine(uploadFolderName, uploadedFile.FileName);
using var stream = File.Open(fullPath, FileMode.Create, FileAccess.Write);
await uploadedFile.CopyToAsync(stream);
}
那里。这更短、更清晰、更高效、更快。
评论
0赞
Yogi
6/8/2023
那行得通!谢谢艾蒂安!
评论
.ToByteArrayAsync()
.Append
contents
IEnumerable<byte>
addBytes[0]