Saya memiliki webapp halaman tunggal berbasis jquery. Ini berkomunikasi dengan layanan web yang tenang melalui panggilan AJAX.
Saya mencoba mencapai yang berikut:
- Kirim POST yang berisi data JSON ke url REST.
- Jika permintaan menentukan respons JSON, maka JSON dikembalikan.
- Jika permintaan menentukan tanggapan PDF / XLS / etc, maka biner yang dapat diunduh dikembalikan.
Saya memiliki 1 & 2 yang berfungsi sekarang, dan aplikasi jquery klien menampilkan data yang dikembalikan di halaman web dengan membuat elemen DOM berdasarkan pada data JSON. Saya juga memiliki # 3 yang berfungsi dari sudut pandang layanan web, artinya akan membuat dan mengembalikan file biner jika diberi parameter JSON yang benar. Tapi saya tidak yakin cara terbaik untuk menangani # 3 dalam kode javascript klien.
Apakah mungkin untuk mendapatkan file yang dapat diunduh kembali dari panggilan ajax seperti ini? Bagaimana cara mendapatkan browser untuk mengunduh dan menyimpan file?
$.ajax({
type: "POST",
url: "/services/test",
contentType: "application/json",
data: JSON.stringify({category: 42, sort: 3, type: "pdf"}),
dataType: "json",
success: function(json, status){
if (status != "success") {
log("Error loading data");
return;
}
log("Data loaded!");
},
error: function(result, status, err) {
log("Error loading data");
return;
}
});
Server merespons dengan tajuk berikut:
Content-Disposition:attachment; filename=export-1282022272283.pdf
Content-Length:5120
Content-Type:application/pdf
Server:Jetty(6.1.11)
Gagasan lain adalah membuat PDF dan menyimpannya di server dan mengembalikan JSON yang menyertakan URL ke file. Kemudian, panggil panggilan lain di penangan sukses ajax untuk melakukan sesuatu seperti berikut:
success: function(json,status) {
window.location.href = json.url;
}
Tetapi melakukan itu berarti saya perlu melakukan lebih dari satu panggilan ke server, dan server saya perlu membuat file yang dapat diunduh, menyimpannya di suatu tempat, kemudian secara berkala membersihkan area penyimpanan itu.
Pasti ada cara yang lebih sederhana untuk mencapai ini. Ide ide?
EDIT: Setelah meninjau dokumen seharga $ .ajax, saya melihat bahwa tipe data respon hanya bisa salah satunya xml, html, script, json, jsonp, text
, jadi saya kira tidak ada cara untuk langsung mengunduh file menggunakan permintaan ajax, kecuali saya menyematkan file biner dalam menggunakan Skema URI data seperti yang disarankan dalam jawaban @VinayC (yang bukan sesuatu yang ingin saya lakukan).
Jadi saya kira pilihan saya adalah:
Tidak menggunakan ajax dan sebagai gantinya mengirimkan formulir posting dan embed data JSON saya ke dalam nilai formulir. Mungkin perlu dipusingkan dengan iframe tersembunyi dan semacamnya.
Tidak menggunakan ajax dan sebaliknya mengubah data JSON saya menjadi string kueri untuk membangun permintaan GET standar dan mengatur window.location.href ke URL ini. Mungkin perlu menggunakan event.preventDefault () di penangan klik saya untuk menjaga browser agar tidak berubah dari URL aplikasi.
Gunakan ide saya yang lain di atas, tetapi ditingkatkan dengan saran dari jawaban @aikus. Kirim permintaan AJAX dengan beberapa parameter yang memungkinkan layanan web tahu bahwa ini dipanggil melalui panggilan ajax. Jika layanan web dipanggil dari panggilan ajax, cukup kembalikan JSON dengan URL ke sumber yang dihasilkan. Jika sumber daya dipanggil secara langsung, maka kembalikan file biner yang sebenarnya.
Semakin saya memikirkannya, semakin saya suka pilihan terakhir. Dengan cara ini saya dapat memperoleh kembali informasi tentang permintaan (waktu untuk menghasilkan, ukuran file, pesan kesalahan, dll.) Dan saya dapat bertindak atas informasi itu sebelum memulai pengunduhan. Kelemahannya adalah manajemen file tambahan di server.
Adakah cara lain untuk mencapai ini? Adakah kelebihan / kekurangan untuk metode ini yang harus saya ketahui?
url = 'http://localhost/file.php?file='+ $('input').val(); window.open(url);
Cara mudah untuk mendapatkan hasil yang sama. Masukkan header dalam file php. Tidak perlu mengirim ajax atau mendapatkan permintaan