通过ajax调用发送文件的大小是[重复]的大小的4倍

问题描述 投票:0回答:1
我有一个Javascript ajax函数,该函数调用c#Web服务下载zip文件。然后使用Javascript提取zip文件,然后使用该数据。

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

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

Showing original file

您可以看到,它约为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的较大大小传输。 :

Website debugger showing increased file size

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

我正在用一根头发剪头发,所以有人可以向我提供有关我要去哪里的建议,非常感谢!

汤姆

这里要澄清一点,问题不在于Ajax调用接收到的zip文件存在问题。该zip文件可以完美解压缩(解压缩后的数据量约为20MB)。我正在努力的事情是zip文件为2.5MB,但是上述方法将9MB的数据传输到客户端计算机。出于使我的网站尽可能简化的原因,如果原始zip文件很大,则我会选择将2.5MB的数据传输到客户端计算机以进行解压缩,而不是将9MB的原始数据传输给客户端计算机。当前正在转移。

javascript c# ajax file ftp
1个回答
0
投票
对于其他需要知道的人,事实证明,Web服务并非旨在以这种方式传输文件。最后,我创建了一个ASHX函数以将文件作为blob返回。这样可以确保发送的文件大小与原始文件大小完全相同!

对@MartinPrikryl的正确指导,我深表感谢!

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