该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的较大大小传输。 :Website debugger showing increased file size
我认为这可能与我将其作为字节数组返回的事实有关,但是我不确定。有谁知道a)为什么返回的文件是大约文件。原始大小的4倍,b)我如何确保以原始大小发送/接收原始大小,而c)仍然能够获得zip.js正确解压缩。
我正在用一根头发剪头发,所以有人可以向我提供有关我要去哪里的建议,非常感谢!
汤姆
这里要澄清一点,问题不在于Ajax调用接收到的zip文件存在问题。该zip文件可以完美解压缩(解压缩后的数据量约为20MB)。我正在努力的事情是zip文件为2.5MB,但是上述方法将9MB的数据传输到客户端计算机。出于使我的网站尽可能简化的原因,如果原始zip文件很大,则我会选择将2.5MB的数据传输到客户端计算机以进行解压缩,而不是将9MB的原始数据传输给客户端计算机。当前正在转移。
对@MartinPrikryl的正确指导,我深表感谢!