我有一个调用 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 的数据。目前正在转移。