2016-09-22 17 views
5

Tôi tạo một pdf với văn bản và hình ảnh bằng cách sử dụng thư viện javascript jsPDF. Sau đó, tôi muốn gửi tập tin đến máy chủ để gửi một email với nó. Vấn đề là tệp đến trên máy chủ bị hỏng và không thể mở được hoặc tôi không thể nhìn thấy hình ảnh trên pdf.jsPDF - gửi bản pdf đến máy chủ bị hỏng

Mã của tôi:

var pdf = btoa(doc.output()); - điều này mang lại một lỗi: Uncaught InvalidCharacterError: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.

var pdf = btoa(encodeURIComponent(doc.output())); 
var data = new FormData(); 
data.append("data" , pdf); 
var xhr = new XMLHttpRequest(); 
xhr.open('post', '/url', true); 
xhr.send(data); 

Tôi cũng đã cố gắng những thứ khác như:

var pdf = btoa(encodeURIComponent(doc.output('blob'))); - file không thể mở được

var pdf = btoa(doc.output('blob')); - không thể mở tệp

var pdf = btoa(unescape(encodeURIComponent(doc.output()))); - các tập tin sẽ mở ra nhưng những hình ảnh là một số dòng màu xám

PS: Tôi đang sử dụng Laravel 5. Mã Server:

$data = base64_decode($_POST['data']); 
$fname = "test.pdf"; 
$file = fopen("pdf/" .$fname, 'w'); 
fwrite($file, $data); 
fclose($file); 

SOLUTION:

js mã:

var blob = doc.output('blob'); 
var fd = new FormData(); 
fd.append('data', blob); 
$.ajax({ 
    type: 'POST', 
    url: '/url', 
    data: fd, 
    processData: false, 
    contentType: false 
}).done(function(data) { 
    console.log(data); 
}); 

mã máy chủ:

if(!empty($_FILES['data'])){ 
    move_uploaded_file(
     $_FILES['data']['tmp_name'], 
     public_path() . '/test.pdf' 
    ); 
    return "Pdf was successfully saved."; 
} else { 
    return "No Data Sent"; 
} 

Trả lời

4

btoa được điều chỉnh với dải byte ascii ... javascript không thể chứa tất cả ký tự. Đó là lý do tại sao bạn không nên sử dụng readAsBinaryString của FileReader hoặc ... Xử lý nhị phân đúng cách, không phải là chuỗi hoặc chuỗi 3x64 lớn hơn base64, nhưng như một blob, ArrayBuffer hoặc một mảng được đánh máy và nó sẽ trở thành tiền phạt

var blob = doc.output('blob') 
xhr.send(blob) 
+0

Tôi đã thử điều này không có base64_decode trên chương trình phụ trợ nhưng nó không hoạt động .. Không có lỗi nhưng không có tệp nào. –

+0

OK sau khi gỡ lỗi, có vẻ như khi tôi gửi blob đến máy chủ, tôi không có gì trong '$ _POST ['data']'. Nếu tôi gửi một chuỗi đơn giản thì nó hoạt động. Gửi 'doc.output ('blob')' không hoạt động .. –

+0

Tìm được giải pháp từ câu trả lời của bạn, cảm ơn. Tôi đã cập nhật bài đăng với nó. –

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