Bu sorunu bu şekilde çözüyorum.
Jonathan Amend'in bu yazıdaki cevabı bana çok yardımcı oldu.
Aşağıdaki örnek basitleştirilmiştir.
Daha fazla ayrıntı için, yukarıdaki kaynak kodu bir JQuery Ajax isteği (GET, POST, PUT vb.) Kullanarak bir dosya indirebilir . Ayrıca, parametreleri JSON olarak yüklemeye ve içerik türünü application / json (varsayılanım) olarak değiştirmeye yardımcı olur .
Html kaynağı:
<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>
İki giriş metni, bir seçim ve bir düğme öğesi içeren basit bir form.
Javascript sayfa kaynağı:
<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>
Düğme tıklandığında basit bir olay. Bir AjaxDownloadFile nesnesi oluşturur. AjaxDownloadFile sınıf kaynağı aşağıdadır.
AjaxDownloadFile sınıf kaynağı:
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 kitaplığıma eklemek için bu sınıfı oluşturdum. Yeniden kullanılabilir. Umarım yardımcı olur.