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

问题描述 投票:0回答:1

经过大量调试,我能够发现文档尺寸之间的尺寸差异。

实际上,我正在尝试将

.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

由于服务器上的文档大小与客户端收到的文档大小之间存在大小差异,我没有得到相同的文档,而是从服务器接收到损坏的文档。

不确定,为什么客户端的文档大小会改变?

javascript c# asp.net ajax mono
1个回答
0
投票

经过一番挣扎,我终于解决了问题,并从服务器下载了

.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
文件。

© www.soinside.com 2019 - 2024. All rights reserved.