นี่คือวิธีที่ฉันแก้ปัญหานี้
คำตอบของ Jonathan Amend ในโพสต์นี้ช่วยฉันได้มาก
ตัวอย่างด้านล่างเป็นแบบง่าย
สำหรับรายละเอียดเพิ่มเติมรหัสที่มาข้างต้นสามารถที่จะดาวน์โหลดไฟล์โดยใช้คำขอ JQuery อาแจ็กซ์ (ที่ได้รับ POST, PUT ฯลฯ ) มันยังช่วยในการอัปโหลดพารามิเตอร์เป็นJSON และการเปลี่ยนชนิดของเนื้อหาไปยังโปรแกรมประยุกต์ / 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>
รูปแบบง่ายๆที่มีข้อความป้อนสองรายการเลือกหนึ่งรายการและองค์ประกอบปุ่ม
หน้าจาวาสคริปต์มา:
<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 ของฉัน สามารถใช้ซ้ำได้ หวังว่าจะช่วยได้