v2.5.2
Giriş yap

AJAX ile Dosya İndirme İşlemi Nasıl Yapılır?

redline
365 defa görüntülendi

Merhaba PT.

Butona tıklayınca dosya indirtmeye çalışıyorum. AJAX isteği attığım PHP sayfasına normal olarak girince indirme başlıyor. Ancak AJAX ile istek atınca başlatamadım bir türlü.

Dönen cevapta bir sürü kod oluşuyor. Mantık oluşturamadım bir türlü. :)


<a href="#" data-id="1" class="download">
    İNDİRME BAĞLANTISI
</a>


// AJAX işlemleri.

$(document).on("click", 'a.download', function(event) {
  event.preventDefault();
  var contents = {
    'id' : $(this).data("id")
  };
  $.post('downloader.php', contents, function(response){
      if (response.toastr) {
        if (response.toastr == "warning") {
          toastr.warning(response.message);
        }else if (response.toastr == "error") {
          toastr.error(response.message);
        }else if (response.toastr == "info") {
          toastr.info(response.message);
        }else {
          toastr.success(response.message);
        }
      }
  }, 'json');
});


// - downloader.php - Dosya işlemleri.

// Gelen ID ile ilgili kontrolleri yaptıktan sonra;

$file     = "../../prototurk.pdf";
$fileName = "dosya-prototurk";

header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="' . $fileName . '.pdf"');
readfile($file);

// İndirme başlatıldı mesajı.

$result["toastr"]  = "success";
$result["message"] = "İndirme işlemi başladı.";
echo json_encode($result);

Dosyayı bu şekilde indirmeye çalışma sebebim, dosyanın kaynak bağlantısını gizlemek ve bazı kontrollerden geçirip indirmesini istediğim kullanıcının indirebilmesini sağlamak.

Cevap yaz
Cevaplar (2)
redline
446 gün önce

@aykhan Hocam amaç kaynak bağlantısını gizlemek. xhr.open('GET', 'path/to/file', true); kısmında anladığım kadarıyla kaynak bağlantıyı veriyoruz. Yada ben mi yanlış anladım tam bilemedim. :)

aykhan
447 gün önce

AJAX ile dosya indirme işlemi, sunucudan istek yaparak dosyanın içeriğini alıp tarayıcının indirme özelliğini kullanarak gerçekleştirilebilir. Aşağıdaki adımlar bu işlemi yapmak için kullanılabilir:

Sunucudan AJAX isteği yapmak için XMLHttpRequest nesnesi kullanılır.
İsteğin tipi "arraybuffer" veya "blob" olarak ayarlanır.
İsteğin başarılı bir şekilde tamamlanması durumunda, indirilecek dosyanın içeriği response özelliği aracılığıyla alınır.
Dosya içeriğini indirmek için tarayıcının indirme özelliğini kullanmak için URL.createObjectURL() veya URL.createBlobURL() fonksiyonları kullanılabilir.
İndirme işlemi tamamlandıktan sonra, oluşturulan URL nesnesi URL.revokeObjectURL() fonksiyonu ile geçersiz hale getirilmelidir.
Aşağıdaki örnek, AJAX ile sunucudan dosya indirme işlemini gösterir:


var xhr = new XMLHttpRequest();
xhr.open('GET', 'path/to/file', true);
xhr.responseType = 'blob';
xhr.onload = function(e) {
  if (this.status == 200) {
    var blob = new Blob([this.response], {type: 'application/octet-stream'});
    var link = document.createElement('a');
    link.href = window.URL.createObjectURL(blob);
    link.download = 'file.bin';
    link.click();
    window.URL.revokeObjectURL(link.href);
  }
};
xhr.send();