2013-03-17 22 views
17

Ok, Giả sử tôi có dữ liệu tài liệu được lưu ở đâu đó, hãy tự ý lấy this pdf.Tạo và cung cấp PDF Blob đúng cách qua Tệp HTML5 và API URL

Vấn đề # 1. Những gì tôi muốn làm là thực hiện một cuộc gọi AJAX đến URL này (vì tôi cần phải vượt qua một số tiêu đề xác thực và nó là tên miền chéo). Sau đó lấy dữ liệu được trả về, tạo một blob url cho nó, thêm một iFrame vào DOM và chỉ đạo src đến địa chỉ blob.

Hiện nay mã của tôi trông như thế này:

$.ajax({ 
    url:'http://www.grida.no/climate/ipcc_tar/wg1/pdf/tar-01.pdf' 
}).done(function(data){ 
    var file = new Blob([data], {type:'application/pdf'}), 
     url = URL.createObjectURL(file), 
     _iFrame = document.createElement('iframe'); 
     _iFrame.setAttribute('src', url); 
     _iFrame.setAttribute('style', 'visibility:hidden;'); 
     $('#someDiv').append(_iFrame); 
}); 

Thật không may, tôi nhận được một 'Không thể Render PDF' trong iFrame.

Vấn đề # 2. Tôi muốn điều này dẫn đến lời nhắc tải xuống tệp. Bạn không chắc chắn làm thế nào để đảm bảo điều này cho rằng PDF sẽ tự nhiên chỉ hiển thị trong iFrame.

+0

chuỗi dữ liệu bắt đầu như thế này: '% PDF-1,5 % 2504 0 obj <> endobj 2511 0 obj <>/Filter/FlateDecode/ID []/Chỉ mục [2504 10]/Thông tin 2503 0 R/Chiều dài 47/Trước 3720769/Roo t 2505 0 R/Kích thước 2514/Loại/XRef/W [1 2 0] >> dòng h bbd'b'9 ] x? abP | ... ' –

+1

Chỉ cần thông tin cho bất kỳ ai. Kết thúc hoàn toàn làm việc xung quanh vấn đề này bởi vì nó dường như không thể. Tôi đã tạm thời phân phát các tệp trong 10 giây, chỉ một iframe đến url tùy ý của nó và xóa chúng sau khi tải xuống (không có xác thực nào khác ngoài cookie của trình duyệt). –

Trả lời

31

jQuery.ajax hiện không hỗ trợ các đốm màu, xem này bug report #7248 được đóng dưới dạng wontfix.

Tuy nhiên thật dễ dàng để làm XHR cho các đốm màu không jQuery:

var xhr = new XMLHttpRequest(); 
xhr.open('GET', 'http://www.grida.no/climate/ipcc_tar/wg1/pdf/tar-01.pdf', true); 
xhr.responseType = 'blob'; 

xhr.onload = function(e) { 
    if (this.status == 200) { 
    // Note: .response instead of .responseText 
    var blob = new Blob([this.response], {type: 'application/pdf'}), 
     url = URL.createObjectURL(blob), 
     _iFrame = document.createElement('iframe'); 

    _iFrame.setAttribute('src', url); 
    _iFrame.setAttribute('style', 'visibility:hidden;'); 
    $('#someDiv').append(_iFrame)   
    } 
}; 

xhr.send(); 

không biết xấu hổ sao chép từ HTML5rocks.

Nếu jQuery đã hỗ trợ loại Blob, nó có thể đơn giản như:

$.ajax({ 
    url:'http://www.grida.no/climate/ipcc_tar/wg1/pdf/tar-01.pdf', 
    dataType:'blob' 
})... 
+0

Cảm ơn bạn, nó hoạt động. Nhưng nếu tôi không biết loại 'application/pdf' trước đây thì sao? Tôi có thể sử dụng loại MIME từ phản hồi không? – Yiping

+0

Làm thế nào tôi có thể làm cho nó hoạt động bằng cách sử dụng tài nguyên $ trong góc? –

+0

Có, bạn có thể sử dụng mimetype từ phản hồi. Tuy nhiên, lưu ý rằng giải pháp này sẽ * không * cho phép bạn đặt tên tệp mà mọi người sẽ tải xuống. Nó sẽ luôn luôn là một số băm khó chịu hoặc một cái gì đó. – mlissner

Các vấn đề liên quan