ด้านล่างนี้เป็นวิธีการแก้ปัญหาของฉันสำหรับการดาวน์โหลดหลายไฟล์ขึ้นอยู่กับรายการซึ่งประกอบด้วยรหัสบางส่วนและค้นหาในฐานข้อมูลไฟล์จะถูกกำหนดและพร้อมสำหรับการดาวน์โหลด - ถ้ามีอยู่ ฉันกำลังเรียกการกระทำ C # MVC สำหรับแต่ละไฟล์โดยใช้ Ajax
และใช่เช่นเดียวกับคนอื่น ๆ กล่าวว่าเป็นไปได้ที่จะทำใน jQuery Ajax ฉันทำมันด้วยความสำเร็จของอาแจ็กซ์และฉันก็ส่งคำตอบ 200
ดังนั้นนี่คือกุญแจสำคัญ:
success: function (data, textStatus, xhr) {
และนี่คือรหัสของฉัน:
var i = 0;
var max = 0;
function DownloadMultipleFiles() {
if ($(".dataTables_scrollBody>tr.selected").length > 0) {
var list = [];
showPreloader();
$(".dataTables_scrollBody>tr.selected").each(function (e) {
var element = $(this);
var orderid = element.data("orderid");
var iscustom = element.data("iscustom");
var orderlineid = element.data("orderlineid");
var folderPath = "";
var fileName = "";
list.push({ orderId: orderid, isCustomOrderLine: iscustom, orderLineId: orderlineid, folderPath: folderPath, fileName: fileName });
});
i = 0;
max = list.length;
DownloadFile(list);
}
}
จากนั้นโทร:
function DownloadFile(list) {
$.ajax({
url: '@Url.Action("OpenFile","OrderLines")',
type: "post",
data: list[i],
xhrFields: {
responseType: 'blob'
},
beforeSend: function (xhr) {
xhr.setRequestHeader("RequestVerificationToken",
$('input:hidden[name="__RequestVerificationToken"]').val());
},
success: function (data, textStatus, xhr) {
// check for a filename
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 a = document.createElement('a');
var url = window.URL.createObjectURL(data);
a.href = url;
a.download = filename;
document.body.append(a);
a.click();
a.remove();
window.URL.revokeObjectURL(url);
}
else {
getErrorToastMessage("Production file for order line " + list[i].orderLineId + " does not exist");
}
i = i + 1;
if (i < max) {
DownloadFile(list);
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
},
complete: function () {
if(i===max)
hidePreloader();
}
});
}
C # MVC:
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult OpenFile(OrderLineSimpleModel model)
{
byte[] file = null;
try
{
if (model != null)
{
//code for getting file from api - part is missing here as not important for this example
file = apiHandler.Get<byte[]>(downloadApiUrl, token);
var contentDispositionHeader = new System.Net.Mime.ContentDisposition
{
Inline = true,
FileName = fileName
};
// Response.Headers.Add("Content-Disposition", contentDispositionHeader.ToString() + "; attachment");
Response.Headers.Add("Content-Type", "application/pdf");
Response.Headers.Add("Content-Disposition", "attachment; filename=" + fileName);
Response.Headers.Add("Content-Transfer-Encoding", "binary");
Response.Headers.Add("Content-Length", file.Length.ToString());
}
}
catch (Exception ex)
{
this.logger.LogError(ex, "Error getting pdf", null);
return Ok();
}
return File(file, System.Net.Mime.MediaTypeNames.Application.Pdf);
}
ตราบใดที่คุณคืนการตอบสนอง 200 ความสำเร็จใน Ajax สามารถทำงานกับมันได้คุณสามารถตรวจสอบว่าไฟล์มีอยู่จริงหรือไม่เพราะบรรทัดด้านล่างในกรณีนี้จะเป็นเท็จและคุณสามารถแจ้งให้ผู้ใช้ทราบเกี่ยวกับสิ่งนั้น:
if (disposition && disposition.indexOf('attachment') !== -1) {