การสนับสนุนการดาวน์โหลดไฟล์ไบนารีในการใช้ ajax นั้นไม่ดีนัก แต่ยังอยู่ระหว่างการพัฒนาเป็นแบบร่างที่ใช้งานได้
วิธีดาวน์โหลดง่ายๆ:
คุณสามารถให้เบราว์เซอร์ดาวน์โหลดไฟล์ที่ร้องขอได้ง่ายๆโดยใช้รหัสด้านล่างและสิ่งนี้ได้รับการสนับสนุนในทุกเบราว์เซอร์และจะทำให้คำขอ WebApi เหมือนกันอย่างเห็นได้ชัด
$scope.downloadFile = function(downloadPath) {
window.open(downloadPath, '_blank', '');
}
วิธีการดาวน์โหลด Ajax ไบนารี:
การใช้ ajax เพื่อดาวน์โหลดไฟล์ไบนารีสามารถทำได้ในบางเบราว์เซอร์และด้านล่างนี้เป็นการใช้งานที่จะทำงานใน Chrome, Internet Explorer, FireFox และ Safari รุ่นล่าสุด
ใช้arraybuffer
ประเภทการตอบกลับซึ่งจะถูกแปลงเป็น JavaScript blob
ซึ่งจะถูกนำเสนอให้บันทึกโดยใช้saveBlob
วิธีการนี้แม้ว่าจะมีอยู่ใน Internet Explorer ในปัจจุบันเท่านั้นหรือเปลี่ยนเป็น URL ข้อมูลหยดซึ่งเบราว์เซอร์เปิดขึ้น กล่องโต้ตอบดาวน์โหลดหากประเภท mime ได้รับการสนับสนุนสำหรับการดูในเบราว์เซอร์
การสนับสนุน Internet Explorer 11 (คงที่)
หมายเหตุ: Internet Explorer 11 ไม่ชอบใช้msSaveBlob
ฟังก์ชันนี้หากมีการใช้นามแฝง - อาจเป็นคุณลักษณะด้านความปลอดภัย แต่มีแนวโน้มว่าจะเกิดข้อบกพร่องดังนั้นการใช้var saveBlob = navigator.msSaveBlob || navigator.webkitSaveBlob ... etc.
เพื่อพิจารณาการsaveBlob
สนับสนุนที่มีอยู่ทำให้เกิดข้อยกเว้น ด้วยเหตุนี้โค้ดด้านล่างจึงทดสอบnavigator.msSaveBlob
แยกกัน ขอบคุณ? ไมโครซอฟต์
$scope.downloadFile = function(httpPath) {
$http.get(httpPath, { responseType: 'arraybuffer' })
.success( function(data, status, headers) {
var octetStreamMime = 'application/octet-stream';
var success = false;
headers = headers();
var filename = headers['x-filename'] || 'download.bin';
var contentType = headers['content-type'] || octetStreamMime;
try
{
console.log("Trying saveBlob method ...");
var blob = new Blob([data], { type: contentType });
if(navigator.msSaveBlob)
navigator.msSaveBlob(blob, filename);
else {
var saveBlob = navigator.webkitSaveBlob || navigator.mozSaveBlob || navigator.saveBlob;
if(saveBlob === undefined) throw "Not supported";
saveBlob(blob, filename);
}
console.log("saveBlob succeeded");
success = true;
} catch(ex)
{
console.log("saveBlob method failed with the following exception:");
console.log(ex);
}
if(!success)
{
var urlCreator = window.URL || window.webkitURL || window.mozURL || window.msURL;
if(urlCreator)
{
var link = document.createElement('a');
if('download' in link)
{
try
{
console.log("Trying download link method with simulated click ...");
var blob = new Blob([data], { type: contentType });
var url = urlCreator.createObjectURL(blob);
link.setAttribute('href', url);
link.setAttribute("download", filename);
var event = document.createEvent('MouseEvents');
event.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
link.dispatchEvent(event);
console.log("Download link method with simulated click succeeded");
success = true;
} catch(ex) {
console.log("Download link method with simulated click failed with the following exception:");
console.log(ex);
}
}
if(!success)
{
try
{
console.log("Trying download link method with window.location ...");
var blob = new Blob([data], { type: octetStreamMime });
var url = urlCreator.createObjectURL(blob);
window.location = url;
console.log("Download link method with window.location succeeded");
success = true;
} catch(ex) {
console.log("Download link method with window.location failed with the following exception:");
console.log(ex);
}
}
}
}
if(!success)
{
console.log("No methods worked for saving the arraybuffer, using last resort window.open");
window.open(httpPath, '_blank', '');
}
})
.error(function(data, status) {
console.log("Request failed with status: " + status);
$scope.errorDetails = "Request failed with status: " + status;
});
};
การใช้งาน:
var downloadPath = "/files/instructions.pdf";
$scope.downloadFile(downloadPath);
หมายเหตุ:
คุณควรแก้ไขวิธี WebApi ของคุณเพื่อส่งคืนส่วนหัวต่อไปนี้:
ฉันใช้x-filename
ส่วนหัวเพื่อส่งชื่อไฟล์ นี่คือส่วนหัวที่กำหนดเองเพื่อความสะดวกอย่างไรก็ตามคุณสามารถแยกชื่อไฟล์จากcontent-disposition
ส่วนหัวโดยใช้นิพจน์ทั่วไป
คุณควรตั้งค่าcontent-type
ส่วนหัวละครใบ้สำหรับการตอบสนองของคุณด้วยเพื่อให้เบราว์เซอร์รู้รูปแบบข้อมูล
ฉันหวังว่านี่จะช่วยได้.