Saya memiliki kelas tindakan yang menghasilkan PDF. Ini contentType
disetel dengan tepat.
public class MyAction extends ActionSupport
{
public String execute() {
...
...
File report = signedPdfExporter.generateReport(xyzData, props);
inputStream = new FileInputStream(report);
contentDisposition = "attachment=\"" + report.getName() + "\"";
contentType = "application/pdf";
return SUCCESS;
}
}
Saya menyebutnya action
melalui panggilan Ajax. Saya tidak tahu cara mengirimkan streaming ini ke browser. Saya mencoba beberapa hal tetapi tidak ada yang berhasil.
$.ajax({
type: "POST",
url: url,
data: wireIdList,
cache: false,
success: function(response)
{
alert('got response');
window.open(response);
},
error: function (XMLHttpRequest, textStatus, errorThrown)
{
alert('Error occurred while opening fax template'
+ getAjaxErrorString(textStatus, errorThrown));
}
});
Di atas memberikan kesalahan:
Browser Anda mengirimkan permintaan yang tidak dapat dipahami server ini.
sumber
content-disposition
disetel keattachment
, Anda hanya akan mendapatkanSave as
dialog. Halaman induk tidak akan berubah. Just<a href="pdfservlet/filename.pdf">pdf</a>
or a<form action="pdfservlet/filename.pdf"><input type="submit"></form>
lebih dari cukup.POST
data.Inilah cara saya membuat ini berfungsi
Jawaban yang diperbarui menggunakan download.js
sumber
Saya tidak benar-benar berpikir bahwa jawaban masa lalu menemukan masalah dari poster asli. Mereka semua menganggap permintaan GET saat pembuat poster mencoba POST data dan mendapatkan unduhan sebagai tanggapan.
Dalam proses mencari jawaban yang lebih baik, kami menemukan Plugin jQuery ini untuk Meminta Unduhan File seperti Ajax .
Dalam "jantungnya", ini membuat formulir HTML "sementara" yang berisi data yang diberikan sebagai bidang masukan. Formulir ini ditambahkan ke dokumen dan diposting ke URL yang diinginkan. Segera setelah itu formulir tersebut dihapus lagi:
Perbarui jawaban Mayur terlihat cukup menjanjikan dan sangat sederhana dibandingkan dengan plug-in jQuery yang saya rujuk.
sumber
Beginilah cara saya mengatasi masalah ini.
Jawaban dari Jonathan Amend pada posting ini sangat membantu saya.
Contoh di bawah ini disederhanakan.
Untuk lebih jelasnya, source code di atas dapat mendownload file menggunakan request JQuery Ajax (GET, POST, PUT dll) . Ini, juga, membantu mengunggah parameter sebagai JSON dan mengubah tipe konten ke application / json (default saya) .
Sumber html :
Bentuk sederhana dengan dua teks masukan, satu pilih dan satu elemen tombol.
The Halaman javascript Sumber:
Acara sederhana dengan mengklik tombol. Ini membuat objek AjaxDownloadFile. Sumber kelas AjaxDownloadFile ada di bawah.
The AjaxDownloadFile kelas sumber:
Saya membuat kelas ini untuk ditambahkan ke perpustakaan JS saya. Ini dapat digunakan kembali. Semoga membantu.
sumber
Blob
objek didukung di IE10 +.responseType
xhr kearraybuffer
ataublob
agar ini berfungsi. (Jika tidak, ini bekerja dengan baik.)Apa yang berhasil untuk saya adalah kode berikut, karena fungsi server sedang mengambil
File(memoryStream.GetBuffer(), "application/pdf", "fileName.pdf");:
sumber
Anda dapat menggunakan plugin ini untuk membuat formulir, dan mengirimkannya, lalu menghapusnya dari halaman.
Ini berhasil untuk saya. Temukan plugin ini di sini
sumber
Kode berikut berhasil untuk saya
sumber
Untuk memperbaiki masalah PDF kosong dalam permintaan posting untuk mendapatkan data streaming seperti PDF, kita perlu menambahkan jenis respons sebagai 'arraybuffer' atau 'blob' dalam permintaan
sumber
Mengenai jawaban yang diberikan oleh Mayur Padshala ini adalah logika yang benar untuk mendownload file pdf melalui ajax tetapi seperti yang lain laporkan di komentar solusi ini memang mendownload pdf kosong.
Alasan untuk hal ini dijelaskan dalam jawaban yang diterima dari pertanyaan ini : jQuery memiliki beberapa masalah saat memuat data biner menggunakan permintaan AJAX, karena belum mengimplementasikan beberapa kemampuan HTML5 XHR v2, lihat permintaan peningkatan ini dan diskusi ini .
Jadi menggunakan
HTMLHTTPRequest
kode akan terlihat seperti ini:sumber
buat iframe tersembunyi, lalu di kode ajax Anda di atas:
url:
document.getElementById('myiframeid').src = your_server_side_url
,dan hapus
window.open(response);
sumber
Cuplikan ini untuk pengguna angular js yang akan menghadapi masalah yang sama, Perhatikan bahwa file respons diunduh menggunakan peristiwa klik terprogram. Dalam hal ini, header dikirim oleh server yang berisi nama file dan konten / jenis.
sumber
Apakah Anda harus melakukannya dengan Ajax? Bukankah itu kemungkinan untuk memuatnya dalam iframe?
sumber
Semoga ini akan menyelamatkan Anda beberapa jam dan menghindarkan Anda dari sakit kepala. Butuh beberapa saat bagi saya untuk memikirkan hal ini, tetapi melakukan permintaan $ .ajax () biasa merusak file PDF saya, sementara memintanya melalui bilah alamat bekerja dengan sempurna. Solusinya adalah ini:
Sertakan download.js: http://danml.com/download.html
Kemudian gunakan XMLHttpRequest sebagai ganti permintaan $ .ajax ().
sumber
sumber
Jika Anda harus bekerja dengan aliran file (jadi tidak ada PDF yang disimpan secara fisik) seperti yang kami lakukan dan Anda ingin mengunduh PDF tanpa memuat ulang halaman, fungsi berikut berfungsi untuk kami:
HTML
Javascript
Karena target = "pdf-download-output" , respons ditulis ke dalam iframe dan oleh karena itu tidak ada pemuatan ulang halaman yang dijalankan, tetapi pdf-response-stream dikeluarkan di browser sebagai unduhan.
sumber