asp.net 文件“sample.docx”已损坏,因此无法打开,原因是由于文档操作或由于数据传输损坏,使用C#

guicsvcw  于 2023-10-21  发布在  .NET
关注(0)|答案(1)|浏览(89)

经过大量的调试,我能够找到有关文件大小之间的大小差异。
实际上,我正在尝试发送.docx文件到客户端,这里是我的C#块代码,看起来像

FileInfo file = new FileInfo(documentFilePath);
byte[] fileConent = File.ReadAllBytes(documentFilePath);
Console.WriteLine("Byte Length :" + fileConent.Length);

context.Response.Clear();
context.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", file.Name));
context.Response.AddHeader("Content-Length", file.Length.ToString());
context.Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
context.Response.BinaryWrite(fileConent);
context.Response.End();

上述代码的输出给出了文档文件大小如下

Byte Length :4338

下面是下载.docx文件的客户端代码,如下所示

$.ajax({
    type: "POST",
    url: '/exportDataForDocument,
    data: JSON.stringify(result),
    responseType: 'arraybuffer',
    success: function(data, textStatus, xhr) {
        var fileName = "sample.docx";
        var blob = new Blob([data], { type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document" });
        console.log("Byte length of the Blob: " + blob.size + " bytes");

        //Check the Browser type and download the File.
        var isIE = false || !!document.documentMode;
        if(isIE) {
            window.navigator.msSaveBlob(blob, fileName);
        } else {
            var url = window.URL || window.webkitURL;
            link = url.createObjectURL(blob);
            var a_down = $("<a />");
            a_down.attr("download", fileName);
            a_down.attr("href", link);
            $("body").append(a_down);
            a_down[0].click();
            a_down.remove();
        }
    }
},

上面的JS块给出了下载文档文件的字节大小

Byte length of the Blob: 7045 bytes

由于服务器上的文档大小和客户端收到的文档大小之间的大小差异,我没有得到相同的文档,而是从服务器接收损坏的文档。
不知道,为什么文件大小在客户端改变?

dxxyhpgq

dxxyhpgq1#

经过一番努力,我终于能够解决这个问题,并从服务器下载.docx文件。
对服务器代码做了一些修改,如下所示:

context.Response.Clear();
context.Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
context.Response.AppendHeader("Content-Disposition", string.Format("attachment; filename={0}", documentFileName));
context.Response.AppendHeader("X-Request-URL", context.Request.Url.PathAndQuery);
context.Response.TransmitFile(documentFilePath);
context.Response.Flush();
context.Response.End();

并对前端代码做了一些修改,如下所示:

$.ajax({
 type: "POST",
 url: '/exportDataForDocument,
 data: JSON.stringify(result),
 xhrFields: {
     responseType: 'blob'
 },
 success: function(data, textStatus, xhr) {
     var contentDisposition = xhr.getResponseHeader('Content-Disposition');
     var fileName = xhr.getResponseHeader('Content-Disposition').split("filename=")[1];
     
     var a = document.createElement('a');
     var url = window.URL || window.webkitURL;
     var objectUrl = url.createObjectURL(data);
     a.style.display = 'none';
     a.href = objectUrl;
     a.download = fileName;
     document.body.appendChild(a);
     a.click();
     document.body.removeChild(a);
     url.revokeObjectURL(objectUrl);        
 },
 error: function(e) {
     console.log(e)
 }
});

最后,我能够从服务器下载一个正确的和正确的相同大小的.docx文件。

相关问题