2015-04-23 7 views
6

Используя плагин jsPDF, я создаю файл .pdf и создаю загрузку на основе нажатия кнопки. Я хотел бы сохранить файл на своем сервере, а не инициировать загрузку. Так что, когда кнопка нажата, я хотел бы файл, который будет сохранен в:Хранение сгенерированных PDF-файлов на сервере

/tmp/uploads/pdf/example.pdf 

Я знаю, мне нужно, придется использовать Jquery.Ajax, чтобы отправить файл на сервер. Однако, глядя на документацию, я не видел никакой поддержки для .pdf в качестве типа данных.

Мой код:

$(document).on("click", "#PDF", function() { 
    var table = document.getElementById("result"); 
    var tbl = window.sessionStorage.getItem("tbl"); 
    var cols = [], 
     data = []; 

    function html() { 
     var doc = new jsPDF('p', 'pt'); 
     var res = doc.autoTableHtmlToJson(table, true); 
     doc.autoTable(res.columns, res.data); 
     doc.save(tbl+".pdf"); 
    } 
    html(); 
}); 

Основываясь на этом xml document saving примере я попытался следующие:

var pdfDocument = doc.save(tbl+".pdf"); 
     var pdfRequest = $.ajax({ 
       url: "/tmp/uploads/pdf", 
       processData: false, 
       data: pdfDocument 
      }); 

Этот скачал файл вместо его сохранения. Как сохранить файл?

ответ

8

мне удалось это исправить с помощью FormData(), вот как я это сделал:

$(document).on("click", "#PDF", function() { 
    var table = document.getElementById("result"); 
    var cols = [], 
     data = []; 

    function html() { 
     var doc = new jsPDF('p', 'pt'); 
     var res = doc.autoTableHtmlToJson(table, true); 
     doc.autoTable(res.columns, res.data); 
     var pdf =doc.output(); //returns raw body of resulting PDF returned as a string as per the plugin documentation. 
     var data = new FormData(); 
     data.append("data" , pdf); 
     var xhr = new XMLHttpRequest(); 
     xhr.open('post', 'upload.php', true); //Post to php Script to save to server 
     xhr.send(data); 

    } 
    html(); 
}); 

upload.php

if(!empty($_POST['data'])){ 
    $data = $_POST['data']; 
    $fname = "test.pdf"; // name the file 
    $file = fopen("testa/pdf/" .$fname, 'w'); // open the file path 
    fwrite($file, $data); //save data 
    fclose($file); 
} else { 
    echo "No Data Sent"; 
} 

Ключевой частью является , где вы хотите, чтобы получить сырье PDF данные.

+0

Может у вас есть какие-либо идеи, почему я получаю другой файл contentent в PHP с переменной POST «данные», чем я посылаю из JavaScript? Я предупредил данные перед отправкой. И далее в PHP я сделал эхо, чтобы показать $ _POST ['data']. Затем я предупредил xmlHttp.responseText, и у меня есть что-то другое (а не «уродские» символы, только регулярные символы и много короче). – arrowman

5

Если ваш PDF содержит двоичные данные, вы можете столкнуться с проблемами, если попытаетесь перенести PDF через строку. Я успешно использовал формат вывода blob jsPDF.

var doc = new jsPDF(); 
// ... generate pdf here ... 

// output as blob 
var pdf = doc.output('blob'); 

var data = new FormData(); 
data.append('data' , pdf); 

var xhr = new XMLHttpRequest(); 
xhr.onreadystatechange = function() { 
    if (this.readyState == 4) { 
    if (this.status !== 200) { 
     // handle error 
    } 
    } 
} 

xhr.open('POST', 'upload.php', true); 
xhr.send(data); 

Ваш upload.php затем может использовать $_FILES массив в PHP

<?php 
if(!empty($_FILES['data'])) { 
    // PDF is located at $_FILES['data']['tmp_name'] 
    // rename(...) it or send via email etc. 
    $content = file_get_contents($_FILES['data']['tmp_name']); 
} else { 
    throw new Exception("no data"); 
} 
?> 
Смежные вопросы