2016-09-09 1 views
0

Ich habe endlich die jsreportonline mindestens die Datei generieren. Hier ist mein Code:jsreportonline - Wie in PDF-Datei speichern

request.post({ 
    url: 'https://xxxx.jsreportonline.net/api/report', 
    json: true, 
    headers: { 
    "Content-Type": "application/json", 
    "Authorization" : "Basic "+new Buffer(username:pwd).toString('base64') 
    }, 
    body: { 
    "template" : {'shortid" : xxxxx}, 
    "data" : xxxx, 
    } 
}, function(err, res, body) { 
    **** HERE IS THE PROBLEM **** 
}); 

Ich habe keine Ahnung, wie die PDF-Ausgabe in Variable ‚Körper‘ in einer Datei gespeichert zu schreiben. Ich habe versucht:

var pbs = fs.createWriteStream('./report.pdf'); 
pbs.write(body); 
pbs.end(); 

Ich habe versucht:

var pbs = fs.createWriteStream('./report.pdf', {defaultEncoding: 'binary'}); 

... aber die PDF-Datei wird nie richtig angezeigt. Ich weiß, dass der Code funktioniert, weil ich eine Option auf den Anruf einstellen:

"options" : { 
    "reports" : {"save" : true} 
} 

... und der Bericht zu meinem jsreportonline Konto gespeichert und macht in Ordnung.

Danke für jede Hilfe.

Antwort

2

Sie sollten den Callback nicht verwenden, sondern den von request.post zurückgegebenen Stream direkt pipen. Siehe in Dokument here. Beispiel:

var request = require('request') 
var fs = require('fs') 

request.post({ 
    url: 'https://xxx.jsreportonline.net/api/report', 
    json: true, 
    headers: { 
    'Content-Type': 'application/json', 
    'Authorization' : 'Basic '+new Buffer('xxx:yyy').toString('base64') 
    }, 
    body: { 
    'template' : {'shortid" : xxxxx}, 
    'data' : xxxx, 
} 
}).on('error', function (err) { 
    console.log(err) 
}).pipe(fs.createWriteStream('report.pdf')) 
+0

Es erstellt den Bericht jetzt. Vielen Dank. Wenn es jedoch von jsreport zurückkehrt und den PDF-Bericht erstellt, wird es weder in Firefox noch in Chrome ordnungsgemäß wiedergegeben. Wenn ich jedoch die gespeicherte PDF-Datei in Firefox/Chrome öffne, ist es in Ordnung. Nur wenn es zurückkommt, wird es nicht wiedergegeben. – ImTalkingCode

+0

Hm, vielleicht versuchen, static pdf-Datei zurück und Fehlerbehebung, wenn es funktioniert ohne jsreport –

+0

Ich glaube, jetzt ist es eine Race-Bedingung zwischen (ich nehme an) die asynchrone .pipe (fs.createWriteStream (...)) und wenn ich rufe fs.readFile. – ImTalkingCode

1

Sie können 'busboy' verwenden, um die hochgeladene Datei in eine Datei im Serververzeichnis zu schreiben.

Speichern der Datei: -

var 

express = require("express"), os = require('os'), path = require('path'), Busboy = require('busboy'), fs = require('fs'), app = express(); 

app.post('/savepdf', function(req, res) { 

    var busboy = new Busboy({ 
     headers : req.headers 
    }); 

    busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { 
     console.log("OS tmp dir ========>" + os.tmpDir()); 
     console.log("Base name ========>" + path.basename(filename)); 
     var saveTo = path.join(os.tmpDir(), path.basename(filename)); 
     file.pipe(fs.createWriteStream(saveTo)); 
    }); 
    busboy.on('finish', function() { 
     res.writeHead(200, { 
      'Connection' : 'close' 
     }); 
     console.log("Upload finished !!!"); 
     res.end("Success!"); 
    }); 
    return req.pipe(busboy); 

}); 

app.listen(3000); 
console.log('app started '); 

HTML-Seite verwendet, um die Datei zu testen: -

<html> 
    <head> 
     <title>Post Tool</title> 
    </head> 
    <body> 
     <h1>Save PDF </h1> 
     <h2>Upload Document</h2> 
     <form action="/savepdf" method="post" enctype="multipart/form-data"> 
     <input type="text" name="uploadtext" id="uploadtext" value="Good" /> 
    Choose a file : <input type="file" name="uploadfile" id="uploadfile" multiple/> 

    <input type="submit" value="Upload" /> 
</form> 
    </body> 
</html> 

Ausgang: -

Die Datei gespeichert wurde erfolgreich im Temp-Ordner (dh Windows-Pfad unten).

C: \ Benutzer \ Benutzer-ID \ AppData \ Local \ Temp

Die Dateinamen würde als die hochgeladenen Dateinamen identisch sein.

+0

Ich frage mich nur, ob meine Antwort nützlich ist? – notionquest

+0

Wie kann ich meinen spezifischen Pfad zum Speichern von PDF anstelle von C: \ Benutzer \ BenutzerID \ AppData \ Local \ Temp ????? –

+0

Es wird nicht empfohlen. Wahrscheinlich können Sie das für lokale Testzwecke ausprobieren. – notionquest