नीचे कुछ सूची के आधार पर कई फ़ाइलों को डाउनलोड करने के लिए मेरा समाधान है जिसमें कुछ आईडी हैं और डेटाबेस में देख रहे हैं, फाइलें निर्धारित की जाएंगी और डाउनलोड के लिए तैयार होंगी - यदि वे मौजूद हैं। मैं अजाक्स का उपयोग करके प्रत्येक फ़ाइल के लिए C # MVC कार्रवाई कह रहा हूं।
और हां, जैसा कि दूसरों ने कहा, यह jQuery के अजाक्स में करना संभव है। मैंने इसे अजाक्स की सफलता के साथ किया और मैं हमेशा प्रतिक्रिया 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 वापस करते हैं, तब तक अजाक्स में सफलता इसके साथ काम कर सकती है, आप जांच सकते हैं कि क्या वास्तव में फाइल मौजूद है या नहीं, क्योंकि इस मामले में नीचे की रेखा झूठी होगी और आप उपयोगकर्ता को इसके बारे में सूचित कर सकते हैं:
if (disposition && disposition.indexOf('attachment') !== -1) {