Rumah >hujung hadapan web >tutorial js >Bagaimanakah Saya Boleh Mencetuskan Muat Turun Fail dalam AJAX Post Responses?

Bagaimanakah Saya Boleh Mencetuskan Muat Turun Fail dalam AJAX Post Responses?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-20 09:34:07813semak imbas

How Can I Trigger File Downloads in AJAX Post Responses?

Mengendalikan Muat Turun Fail dalam AJAX Post Responses

Apabila mereka bentuk aplikasi AJAX, adalah perkara biasa untuk mengendalikan pelbagai jenis respons, termasuk JSON dan kemungkinan fail lampiran. Mengesan jenis respons berdasarkan pengepala Jenis Kandungan dan Pelupusan Kandungan adalah mudah. Walau bagaimanapun, mencetuskan dialog muat turun boleh menimbulkan cabaran.

Mujurlah, penyemak imbas moden menyediakan penyelesaian melalui FileAPI. Coretan kod berikut menunjukkan cara melaksanakan muat turun fail dalam permintaan siaran AJAX:

// Using native XMLHttpRequest
var xhr = new XMLHttpRequest();
xhr.open('POST', url, true);
xhr.responseType = 'blob';
xhr.onload = function () {
  if (this.status === 200) {
    // Retrieve the blob and filename from the response
    var blob = this.response;
    var filename = "";
    var disposition = xhr.getResponseHeader('Content-Disposition');
    if (disposition && disposition.indexOf('attachment') !== -1) {
      filenameRegex = /filename[^;=\n]*=((['"])).*?|[^;\n]*)/;
      matches = filenameRegex.exec(disposition);
      if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, '');
    }
    // Manage file download based on browser capabilities
    if (typeof window.navigator.msSaveBlob !== 'undefined') {
      // IE workaround for a known issue
      window.navigator.msSaveBlob(blob, filename);
    } else {
      var URL = window.URL || window.webkitURL;
      var downloadUrl = URL.createObjectURL(blob);
      var a = document.createElement("a");
      if (a.download !== 'undefined') {
        a.href = downloadUrl;
        a.download = filename;
        document.body.appendChild(a);
        a.click();
      } else {
        window.location.href = downloadUrl;
      }
      setTimeout(function() { URL.revokeObjectURL(downloadUrl); }, 100); // cleanup
    }
  }
};
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.send($.param(params, true));

Jika menggunakan jQuery.ajax:

$.ajax({
  type: "POST",
  url: url,
  data: params,
  xhrFields: {
    responseType: 'blob' // to avoid binary data being mangled on charset conversion
  },
  success: function(blob, status, xhr) {
    // Retrieve the blob and filename from the response
    var filename = "";
    var disposition = xhr.getResponseHeader('Content-Disposition');
    if (disposition && disposition.indexOf('attachment') !== -1) {
      filenameRegex = /filename[^;=\n]*=((['"])).*?|[^;\n]*)/;
      matches = filenameRegex.exec(disposition);
      if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, '');
    }
    // Manage file download based on browser capabilities
    if (typeof window.navigator.msSaveBlob !== 'undefined') {
      // IE workaround for a known issue
      window.navigator.msSaveBlob(blob, filename);
    } else {
      var URL = window.URL || window.webkitURL;
      var downloadUrl = URL.createObjectURL(blob);
      var a = document.createElement("a");
      if (a.download !== 'undefined') {
        a.href = downloadUrl;
        a.download = filename;
        document.body.appendChild(a);
        a.click();
      } else {
        window.location.href = downloadUrl;
      }
      setTimeout(function() { URL.revokeObjectURL(downloadUrl); }, 100); // cleanup
    }
  }
});

Dengan menggabungkan teknik ini, anda boleh memastikan AJAX anda permintaan siaran boleh mengendalikan lampiran fail dengan lancar dan mencetuskan dialog muat turun untuk pelanggan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencetuskan Muat Turun Fail dalam AJAX Post Responses?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn