2016-09-09 16 views
0

私は最終的に少なくともファイルを生成するためにjsreportonlineを手に入れました。私のコードは次のとおりです。jsreportonline - PDFファイルに保存する方法

変数 'body'に格納されたpdf出力をファイルに書き込む方法がありません。私が試した

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

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

を...しかし、PDFファイルが正しく表示されない決して私が試してみました。

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

...と報告書は、私のjsreportonlineアカウントに保存し、細かい描画されています。私は、コールにオプションを設定することができますので、コードが動作する知っています。

ありがとうございました。

答えて

2

コールバックを使用するのではなく、request.postから返されたストリームを直接パイプする必要があります。ドキュメントhereのこちらをご覧ください。例:

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

これでレポートが作成されます。ありがとうございました。しかし、jsreportから戻ってPDFレポートを作成すると、FirefoxやChromeで正しく表示されません。しかし、Firefox/Chromeで保存したPDFファイルを開くと、うまく表示されます。それが返ったときだけレンダリングに失敗します。 – ImTalkingCode

+0

Hm、多分静的なpdfファイルを返そうとし、jsreportなしで動くならトラブルシューティングをしましょう –

+0

私は今、それが非同期の.pipe(fs.createWriteStream(...))とfs.readFile。 – ImTalkingCode

1

「busboy」を使用すると、アップロードしたファイルをサーバーディレクトリのファイルに書き込むことができます。

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

出力: - - :ファイルが保存されてい

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ページは、ファイルをテストするために使用される - は:

ファイルを保存します一時フォルダ(つまり、Windowsの下のパス)で正常に終了しました。

C:\ Users \ユーザーのユーザーID \のAppData \ローカル\ Tempに

ファイル名は、アップロードされたファイル名と同じになります。

+0

私の答えが有用かどうか疑問に思っていますか? – notionquest

+0

C:\ Users \ userid \ AppData \ Local \ Tempの代わりにpdfを保存するための具体的な方法を教えてください。 –

+0

これはお勧めしません。おそらく、ローカルのテスト目的のために、それを試すことができます。サーバー用の – notionquest

関連する問題