Javascript 从POST收到的响应已损坏
我有一个名为DownloadZipFile的服务,它整理数据,然后构建一个Zip文件供下载。此服务将包含流的响应返回到文件 服务: 如果我像这样调用服务,它将下载并正确打开zip文件 服务电话#1 使用服务调用#2,我得到的Zip文件已损坏 可能是编码吗?我检查了正确和不正确Zip文件之间的数据,它们如下所示: 正确的邮政编码: JmĂg€BOM.csvu'Nă0÷Hü195āy/›WÔH[IÕ64îƒ|11;>IÕl®,Wí236;÷mÖ 3月3日,3月3日,5月3日,3月3日,3月3日,3月3日,3月3日,3月3日,3月3日,3月3日,3月3日,3月3日,6月6日,6月3日,3月3日,6月6日,3月6日,3月6日,3月6日,3月6日,3月6日,3月3日,3日,3月3日,3日,3日,3月7日,3日,3月7日,3日,3月7日,3日,3日,3月7日,我方的我方的我方的我方,我方切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切 dÒïïïïïïïïïïïïïïïïïïïïïïïï239BXïïïïïïïïïïïïïïïïïïïïïïïïïJavascript 从POST收到的响应已损坏,javascript,c#,ajax,post,blob,Javascript,C#,Ajax,Post,Blob,我有一个名为DownloadZipFile的服务,它整理数据,然后构建一个Zip文件供下载。此服务将包含流的响应返回到文件 服务: 如果我像这样调用服务,它将下载并正确打开zip文件 服务电话#1 使用服务调用#2,我得到的Zip文件已损坏 可能是编码吗?我检查了正确和不正确Zip文件之间的数据,它们如下所示: 正确的邮政编码: JmĂg€BOM.csvu'Nă0÷Hü195āy/›WÔH[IÕ64îƒ|11;>IÕl®,Wí236;÷mÖ 3月3日,3月3日,5月3日,3月3日,3月3日,3
似乎文件的编码不同。你们觉得怎么样?谢谢穆萨给我这个线索 下面是我用来下载Zip文件的服务呼叫: 服务电话#1
谢谢穆萨给我这个线索 下面是我用来下载Zip文件的服务呼叫: 服务电话#1
差异可能与
DownloadHelper.BuildZipFileData
和newblob([escape(JSON.stringify(zipData))],{type:type}的工作方式有关。似乎不同的字节处理模式对输出保存在ZIP文件中的二进制数据产生了进一步的影响。是的,但如果只是通过创建虚拟表单(服务调用#1)调用服务,我只会正确下载ZIP文件,但我没有获得任何其他状态。我想要的是得到对呼叫的响应,这样我就可以告诉我的应用程序我已经正确下载了。不幸的是,对Blob的响应似乎改变了编码。我必须在哪里强制它呢?用jQueryAjax不能真正下载二进制数据。看,这非常有用,我使用了原生XMLHttpRequest,它很有效。谢谢!:)差异可能与DownloadHelper.BuildZipFileData
和newblob([escape(JSON.stringify(zipData))],{type:type}的工作方式有关。似乎不同的字节处理模式对输出保存在ZIP文件中的二进制数据产生了进一步的影响。是的,但如果只是通过创建虚拟表单(服务调用#1)调用服务,我只会正确下载ZIP文件,但我没有获得任何其他状态。我想要的是得到对呼叫的响应,这样我就可以告诉我的应用程序我已经正确下载了。不幸的是,对Blob的响应似乎改变了编码。我必须在哪里强制它呢?用jQueryAjax不能真正下载二进制数据。看,这非常有用,我使用了原生XMLHttpRequest,它很有效。谢谢!:)
[HttpPost]
public ActionResult DownloadZipFile(string zipData)
{
try
{
// Create the Zip File.
using (MemoryStream zipStream = DownloadHelper.BuildZipFileData(zipData))
{
// Build up the reponse including the file.
HttpContext.Response.ClearContent();
HttpContext.Response.ClearHeaders();
HttpContext.Response.Clear();
HttpContext.Response.Buffer = true;
HttpContext.Response.ContentType = "application/zip";
HttpContext.Response.AddHeader("Content-Disposition", "attachment; filename=MyZipFile.zip;");
HttpContext.Response.BinaryWrite(zipStream.ToArray());
HttpContext.Response.End();
}
}
catch (Exception e)
{
// Log the error.
_logService.Error(LogHelper.GetWebRequestInfo(ControllerContext.HttpContext.Request), e);
}
}
var form = $("<form></form>").attr('action', "DownloadZipFile").attr("method", "post");
form.append($("<input></input>").attr("type", "hidden").attr("name", "zipData").attr('value', escape(JSON.stringify(zipData))));
form.appendTo('body').submit().remove();
$.post("DownloadZipFile", { zipData: escape(JSON.stringify(zipData)) },
function (data, status, response) {
var filename = "";
var disposition = response.getResponseHeader('Content-Disposition');
if (disposition && disposition.indexOf('attachment') !== -1) {
var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
var matches = filenameRegex.exec(disposition);
if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, '');
}
var type = response.getResponseHeader('Content-Type');
var blob = new Blob([data], { type: type });
if (typeof window.navigator.msSaveBlob !== 'undefined') {
window.navigator.msSaveBlob(blob, filename);
} else {
var URL = window.URL || window.webkitURL;
var downloadUrl = URL.createObjectURL(blob);
if (filename) {
var a = document.createElement("a");
if (typeof a.download === 'undefined') {
window.location = downloadUrl;
} else {
a.href = downloadUrl;
a.download = filename;
document.body.appendChild(a);
a.click();
}
} else {
window.location = downloadUrl;
}
}
});
var xhrq = new XMLHttpRequest();
xhrq.onreadystatechange = function () {
if (this.readyState == 4 ) {
if (this.status == 200) {
var xhrp = this;
var response = this.response;
// check for a filename
var filename = "";
var disposition = xhrp.getResponseHeader('Content-Disposition');
if (disposition && disposition.indexOf('attachment') !== -1) {
var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
var matches = filenameRegex.exec(disposition);
if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, '');
}
var type = xhrp.getResponseHeader('Content-Type');
var blob = new Blob([response], { type: type, encoding: "UTF-8" });
if (typeof window.navigator.msSaveBlob !== 'undefined') {
window.navigator.msSaveBlob(blob, filename);
} else {
var URL = window.URL || window.webkitURL;
var downloadUrl = URL.createObjectURL(blob);
if (filename) {
var a = document.createElement("a");
if (typeof a.download === 'undefined') {
window.location = downloadUrl;
} else {
a.href = downloadUrl;
a.download = filename;
document.body.appendChild(a);
a.click();
}
} else {
window.location = downloadUrl;
}
setTimeout(function () { URL.revokeObjectURL(downloadUrl); }, 100); // cleanup
}
} else {
// Call Back for Error
}
}
}
// Open HTTP Request and Call API Function
xhrq.open("POST", appPath + "DownloadZipFile");
xhrq.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhrq.responseType = 'blob';
xhrq.send('designData=' + escape(JSON.stringify(zipData)));