Node.js jsreportonline-如何保存在pdf文件中

Node.js jsreportonline-如何保存在pdf文件中,node.js,request,jsreport,Node.js,Request,Jsreport,我终于让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') },

我终于让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'});
我试过:

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>
    <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>
用于测试文件的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>
    <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>

后置工具
保存PDF
上传文件
选择一个文件:
输出:-

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


文件名将与上载的文件名相同。

您可以使用'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>
    <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>
用于测试文件的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>
    <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>

后置工具
保存PDF
上传文件
选择一个文件:
输出:-

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


文件名将与上载的文件名相同。

您不应该使用回调,而是直接通过管道传输从
请求返回的流。post
。在文档中可以看到这一点。例如:

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

您不应该使用回调,而是直接通过管道传输从
请求返回的流。post
。在文档中可以看到这一点。例如:

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


它现在创建报告。非常感谢。但是,当它从jsreport返回并创建pdf报告时,它在Firefox或Chrome中都无法正确呈现。但是,如果我在Firefox/Chrome中打开保存的pdf文件,它会呈现良好的效果。只有当它返回时,它才无法呈现.Hm,如果它在没有JSReport的情况下工作,可能会尝试返回静态pdf文件并进行故障排除。我相信现在这是async.pipe(fs.createWriteStream(…)和调用fs.readFile.Fixed之间的竞争条件。需要在管道调用上放置回调。与在('finish',function(){…})上的.pipe(fs.createWriteStream(…).on一样;我如何给出保存pdf的具体路径来代替C:\Users\userid\AppData\Local\Temp?????——它现在创建报告。谢谢。但是,当它从jsreport返回并创建pdf报告时,它在Firefox或Chrome中都无法正确呈现。但是,如果我在Firefox/Chrome中打开保存的pdf文件,它会呈现良好。只有在如果没有JSReport,可能会尝试返回静态pdf文件并进行故障排除。我相信现在这是async.pipe(fs.createWriteStream(…)和调用fs.readFile.Fixed之间的竞争条件。需要对管道调用进行回调。如在.pipe(fs.createWriteStream(…)中一样('finish',function(){…});我如何给出保存pdf的特定路径以代替C:\Users\userid\AppData\Local\Temp?????我如何给出保存pdf的特定路径以代替C:\Users\userid\AppData\Local\Temp?????不建议这样做。可能出于本地测试的目的,您可以尝试这样做。对于服务器,我需要做什么?在C创建pdf?需要帮助提前感谢我如何给出保存pdf的具体路径以代替C:\Users\userid\AppData\Local\Temp?????不建议这样做。可能出于本地测试目的,您可以尝试这样做。对于服务器,我需要做什么?以及如何在创建pdf时手动提供pdf名称?需要帮助提前感谢