2016-09-22 49 views
5

我使用JavaScript jsPDF庫生成帶有文本和圖像的pdf。然後,我想將文件發送到服務器以便發送電子郵件。問題是,到達服務器上的文件已損壞,無法打開,或者我看不到PDF上的圖像。jsPDF - 發送pdf到服務器最終損壞

我的代碼:

var pdf = btoa(doc.output()); - 這給出了一個錯誤: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); 

我也試着像其他的東西:

var pdf = btoa(encodeURIComponent(doc.output('blob'))); - 文件無法打開

var pdf = btoa(doc.output('blob')); - 文件無法打開

var pdf = btoa(unescape(encodeURIComponent(doc.output()))); - 該文件將打開,但圖像是一些灰色線

PS:我使用Laravel 5.服務器代碼:

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

SOLUTION:

JS代碼:

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); 
}); 

服務器代碼:

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"; 
} 

回答

4

btoa與ascii字節範圍搞砸了...... javascript無法保存所有字符。這就是爲什麼你不應該使用FileReader的readAsBinaryString的原因......處理二進制正確的方式,不是字符串或〜3倍較大的base64字符串,但作爲一個blob,ArrayBuffer或一個類型的數組,它會變得很好

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

我試過在後臺沒有base64_decode,但它不工作..沒有錯誤,但沒有文件。 –

+0

確定經過一些調試後,似乎當我將blob發送到服務器時,我在$ _POST ['data']'中沒有任何內容。如果我發送一個簡單的字符串,它正在工作。發送'doc.output('blob')'不起作用.. –

+0

找到你的答案的解決方案,謝謝。我用它更新了這篇文章。 –