这是我解决这个问题的方法。
Jonathan Amend在
这篇文章中的答案对我帮助很大。
下面的示例已经简化了。
要了解更多细节,上述源代码能够使用JQuery Ajax请求(GET、POST、PUT等)下载文件。它还可以帮助上传JSON参数并将内容类型更改为application/json(默认值)。
html源代码:
<form method="POST">
<input type="text" name="startDate"/>
<input type="text" name="endDate"/>
<input type="text" name="startDate"/>
<select name="reportTimeDetail">
<option value="1">1</option>
</select>
<button type="submit"> Submit</button>
</form>
一个简单的表单,包含两个输入框、一个下拉选择框和一个按钮元素。
Javascript页面源代码:
<script type="text/javascript" src="JQuery 1.11.0 link"></script>
<script type="text/javascript">
$(document).on("ready", function(){
$("form button").on("click", function (event) {
event.stopPropagation();
new AjaxDownloadFile({
url: "url that returns a file",
data: JSON.stringify($("form").serializeObject())
});
return false;
});
});
</script>
按钮点击时会触发一个简单的事件。它会创建一个AjaxDownloadFile对象。下面是AjaxDownloadFile类的源代码。
AjaxDownloadFile类源代码:
var AjaxDownloadFile = function (configurationSettings) {
this.settings = {
url: "",
type: "POST",
headers: {
"Content-Type": "application/json; charset=UTF-8"
},
data: {},
onSuccessStart: function (response, status, xhr, self) {
},
onSuccessFinish: function (response, status, xhr, self, filename) {
},
onErrorOccured: function (response, status, xhr, self) {
}
};
this.download = function () {
var self = this;
$.ajax({
type: this.settings.type,
url: this.settings.url,
headers: this.settings.headers,
data: this.settings.data,
success: function (response, status, xhr) {
self.settings.onSuccessStart(response, status, xhr, self);
var filename = "";
var disposition = xhr.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 = xhr.getResponseHeader("Content-Type");
var blob = new Blob([response], {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;
}
setTimeout(function () {
URL.revokeObjectURL(downloadUrl);
}, 100);
}
self.settings.onSuccessFinish(response, status, xhr, self, filename);
},
error: function (response, status, xhr) {
self.settings.onErrorOccured(response, status, xhr, self);
}
});
};
{
$.extend(this.settings, configurationSettings);
this.download();
}
};
我创建了这个类,以便将其添加到我的JS库中。它是可重复使用的。希望这有所帮助。
$.ajax()
зҡ„еҸӮж•°дёӯж·»еҠxhrFields: { responseType: 'blob' }
жҲҗеҠҹи§ЈеҶідәҶз©әзҷҪPDFй—®йўҳгҖӮ - Jesse Hogan