0

我有一个调用 ac# webservice 来下载 zip 文件的 Javascript ajax 函数。然后在 Javascript 中提取 zip 文件,然后我使用该数据。

Web 服务转到 FTP 站点并下载大约 2.6MB 的文件并将其发送回 ajax 函数。但是,ajax 获取文件时,大约是原来的 4 倍大!

这是具有原始文件大小的图像:

显示原始文件

如您所见,它大约为 2.6 MB

我正在使用以下代码下载它:

public static byte[] DownloadFTPFile(string ftpUrl, string userName, string password, bool useSsl, bool allowInvalidCertificate, bool useActiveFtp)
    {

            FtpWebRequest request = CreateFtpWebRequest(ftpUrl, userName, password, useSsl, allowInvalidCertificate, useActiveFtp);
            request.Method = WebRequestMethods.Ftp.DownloadFile;

            FtpWebResponse response = (FtpWebResponse)request.GetResponse();

            Stream responseStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(responseStream);

            var bytes = default(byte[]);
            using (var memstream = new MemoryStream())
            {
                reader.BaseStream.CopyTo(memstream);
                bytes = memstream.ToArray();
            }

            reader.Close();
            response.Close();

            return bytes;

    }

调用上述内容的 Web 服务如下所示:

 [WebMethod(EnableSession = true)]
    public byte[] GetLatestFile()
    {

            return DownloadFTPFile(ftpUrl, userName, password, useSsl, allowInvalidCertificate, useActiveFtp)
    }

最后,这是实际请求该文件的 ajax Javascript 代码,然后使用 zip.js 将其解压缩:

function GetMyData() {
        $.ajax({
            type: 'POST',
            url: '../WebServices/MyWebServiceURL.asmx/GetLatestFile',
            contentType: 'application/json; charset=utf-8',
            responseType: "arraybuffer",
            success: function (data) {
                if (data.d == 0) {
                    logOut();
                } else {
                    UnpackData(data.d);
                }
            },
            error: function (err) {
                //Handle error
            }
        });
    }

    function UnpackData(string) {
        var responseArray = new Uint8Array(string);
        var blobData = new Blob([responseArray], {
            type: 'application/zip'
        });
        zip.createReader(new zip.BlobReader(blobData), function (zipReader) {
            zipReader.workerScriptsPath = "../Javascript/";
            zipReader.getEntries(function (entries) {
                if (entries.length) {
                    entries[0].getData(new zip.TextWriter(), function (data) {
                        DoSomethingWithUnpackedData(data);
                        zipReader.close(function () {
                        });

                    }, function (current, total) {
                    });
                }
            });
        }, function (error) {
            // onerror callback
        });            
    }

    function DoSomethingWithUnpackedData(data) {
        //Do stuff here
    }

在这里,responseArray 变量包含正确的字节数(大约 2.6 MB) - 这一切都很好,但如果我检查流量,那么原来 2.6MB 的文件现在正在以相当大的 8.9MB 传输:

网站调试器显示文件大小增加

我认为这可能与我将它作为字节数组返回这一事实有关,但我不确定。有谁知道a)为什么返回的文件大约是。原始大小的 4 倍,b) 我如何确保将其作为原始大小发送/接收,而 c) 仍然能够让 zip.js 正确解包。

我正在为此撕毁我的头发,因此非常感谢有人可以向我提供有关我哪里出错的任何建议!

汤姆。

为了澄清一点,问题不在于 Ajax 调用接收到的 zip 文件存在问题。该 zip 文件完美解压(解压后大约有 20MB 的数据)。我正在努力解决的问题是 zip 文件为 2.5MB,但上述方法将 9MB 的数据传输到客户端计算机。为了使我的网站尽可能精简,如果原始 zip 文件有 2.5MB 大,我当然宁愿将 2.5MB 的数据传输到客户端机器进行解压缩,而不是 9MB 的数据。目前正在转移。

4

1 回答 1

0

对于任何需要了解的人来说,事实证明 Web 服务并非旨在以这种方式传输文件。最后,我创建了一个 ASHX 函数以将文件作为 blob 返回。这样可以确保发送的文件大小与原始文件大小完全相同!

感谢@MartinPrikryl 为我指明了正确的方向!

于 2020-02-06T15:47:13.540 回答