jsreportonline - 如何保存为 pdf 文件
jsreportonline - How to save in pdf file
我终于得到了至少生成文件的 jsreportonline。这是我的代码:
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 ****
});
我不知道如何将变量 '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 帐户并呈现正常。
感谢您的帮助。
您可以使用'busboy'将上传的文件写入服务器目录中的文件。
正在保存文件:-
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 用于测试文件的页面:-
<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>
输出:-
文件已成功保存在临时文件夹中(即下面的 windows 路径)。
C:\Users\userid\AppData\Local\Temp
文件名与上传的文件名相同
您不应使用回调,而应直接通过管道传输从 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'))
我终于得到了至少生成文件的 jsreportonline。这是我的代码:
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 ****
});
我不知道如何将变量 '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 帐户并呈现正常。
感谢您的帮助。
您可以使用'busboy'将上传的文件写入服务器目录中的文件。
正在保存文件:-
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 用于测试文件的页面:-
<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>
输出:-
文件已成功保存在临时文件夹中(即下面的 windows 路径)。
C:\Users\userid\AppData\Local\Temp
文件名与上传的文件名相同
您不应使用回调,而应直接通过管道传输从 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'))