2016-09-09 3 views
0

Наконец-то я получил jsreportonline, по крайней мере, для создания файла. Вот мой код:jsreportonline - Как сохранить в pdf-файле

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 **** 
}); 

Я понятия не имею, как писать вывод в формате 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. Однако, если я открываю сохраненный pdf-файл в Firefox/Chrome, он отлично выглядит. Только когда он возвращается, он не может отобразить. – ImTalkingCode

+0

Хм, возможно, попробуйте вернуть статический файл PDF и устранить неполадки, если он будет работать без jsreport. –

+0

Я считаю, что теперь это состояние гонки (предположим) async .pipe (fs.createWriteStream (...)), и когда я звоню fs.readFile. – ImTalkingCode

1

Вы можете использовать '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> 

Выход: -

Файл был сохранен успешно в папке temp (т.е. путь к окну ниже).

C: \ Users \ идентификатор пользователя \ AppData \ Local \ Temp

имя файла будет совпадать с именем файла загруженного.

+0

Мне просто интересно, полезен ли мой ответ? – notionquest

+0

Как я могу указать свой путь для сохранения pdf вместо C: \ Users \ userid \ AppData \ Local \ Temp ????? –

+0

Не рекомендуется. Возможно, для локального тестирования вы можете попробовать это. – notionquest

Смежные вопросы