用于上载 .docx 文档时出现 System.IO.File.WriteAllBytes 问题

System.IO.File.WriteAllBytes issue when used for uploading .docx document

提问人:Yogi 提问时间:6/8/2023 更新时间:6/10/2023 访问量:153

问:

我有这样的代码来接受从 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 已损坏

C# .NET WebAPI System.io.file writeallbytes

评论

1赞 Jimi 6/8/2023
您可能应该显示正在做什么以及为什么要将该值传递给此方法 - 不清楚为什么要转换为字节而不是将源流写入文件流.ToByteArrayAsync()
0赞 ProgrammingLlama 6/8/2023
据我所知,与您的实际问题无关,但不会改变 - 它只是返回一个恰好在枚举末尾也具有 of 值的值。您没有捕获返回值,因此它也可能是无操作。.AppendcontentsIEnumerable<byte>addBytes[0]

答:

4赞 Etienne de Martel 6/8/2023 #1

this.HttpContext.Request.ContentLength是整个请求的长度。假设这是一个请求,它比文件的大小大,因为可能有多个文件,并且它还包括边界和每个部分的标题等内容。若要获取文件的大小,请使用样式文件的属性。multipart/form-dataLength

但实际上,这是不必要的。一般来说,除非你已经有一个字节数组作为输入,否则我不喜欢使用,因为这意味着你必须将源数据复制到数组中并将其保存在内存中,这对于大文件来说是不利的。只需使用 a 并直接复制数据,使用 的方法。File.WriteAllBytesFileStreamIFormFileCopyToAsync

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
那行得通!谢谢艾蒂安!