2015-04-23 20 views
6

Utilizzando il plug-in jsPDF, sto creando un file .pdf e genera un download basato su un clic del pulsante. Vorrei salvare il file sul mio server invece di iniziare il download. Così, quando il pulsante viene premuto Vorrei che il file da salvare in:Memorizzazione di file PDF generati sul server

/tmp/uploads/pdf/example.pdf 

Sono consapevole avrei dovuto usare Jquery.Ajax di inviare il file al server. Tuttavia, guardando la documentazione e non ho visto alcun supporto per .pdf come un tipo di dati.

Il mio codice:

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

Sulla base di questo xml document saving esempio ho provato la seguente:

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

Questa scaricato il file invece di salvarlo. Come posso salvare il file?

risposta

8

sono riuscito a risolvere il problema utilizzando FormData(), ecco come ho fatto:

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

La parte fondamentale di essere in cui si desidera ottenere il pdf grezzo dati.

+0

Potrebbe avere alcuna idea del perché ho altro file contentent in PHP da variabile POST 'dati' di quanto io mando da JavaScript? Ho avvisato i dati prima dell'invio. E successivamente in PHP ho fatto eco per mostrare $ _POST ['data']. Successivamente ho avvisato xmlHttp.responseText e ho dio qualcosa di diverso (non "strano" caratteri, solo caratteri regolari e molto più corto). – arrowman

5

Se il PDF contiene dati binari, è possibile che si verifichino dei problemi se si tenta di trasferire il PDF tramite stringa. Ho usato il formato di output blob di jsPDF con successo.

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

tuo upload.php possono poi utilizzare la matrice $_FILES in 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"); 
} 
?> 
Problemi correlati