2016-09-09 2 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

흠, 어쩌면 정적 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 : \ 사용자 \ 사용자 ID \의 AppData \ 로컬 \ 온도

파일 이름 업로드 된 파일 이름과 동일 할 것입니다.

+0

내 답변이 유용할지 궁금합니다. – notionquest

+0

어떻게 C : \ Users \ userid \ AppData \ Local \ Temp ????? 장소에 pdf 저장 특정 경로를 줄 수 있습니까? –

+0

권장하지 않습니다. 아마도 로컬 테스트 목적을 위해 시도해 볼 수 있습니다. 서버에 대한 – notionquest

관련 문제