我有一台快速服务器,可以创建一个pdf文件。
我正在尝试将此文件发送给客户端:
const fs = require('fs');
function download(req, res) {
var filePath = '/../../myPdf.pdf';
fs.readFile(__dirname + filePath, function(err, data) {
if (err) throw new Error(err);
console.log('yeyy, no errors :)');
if (!data) throw new Error('Expected data, but got', data);
console.log('got data', data);
res.contentType('application/pdf');
res.send(data);
});
}

在客户端我想下载它:
_handleDownloadAll = async () => {
console.log('handle download all');
const response = await request.get(
`http://localhost:3000/download?accessToken=${localStorage.getItem(
'accessToken'
)}`
);
console.log(response);
};

我收到了一个像
这样的文字
%PDF-1.4↵1 0 obj↵<<↵/Title (��)↵/Creator (��)↵/Producer (��Qt 5.5.1)↵
&#13;
但我无法下载。
如何从数据创建PDF或直接从服务器下载?
我已经开始工作了 答案很简单。我只是让浏览器使用html锚标记处理下载: 服务器:
function download(req, res) {
const { creditor } = req.query;
const filePath = `/../../${creditor}.pdf`;
res.download(__dirname + filePath);
}
&#13;
客户端:
<a href{`${BASE_URL}?accessToken=${accessToken}&creditor=${creditorId}`} download>Download</a>
&#13;
答案 0 :(得分:0)
您可以通过设置正确的内容处置标题提示浏览器下载文件:
res.setHeader('Content-disposition', 'attachment; filename=myfile.pdf');
答案 1 :(得分:0)
readFile
返回Buffer,这是一个围绕字节的包装器。您正在将Buffer
发送回正在将其登录到控制台的客户端。
你看到的body.text是可以预料的。
您需要使用fs.writeFile
或类似内容将这些字节写入文件。这是一个例子:
_handleDownloadAll = async () => {
console.log('handle download all');
const response = await request.get(
`http://localhost:3000/download?accessToken=${localStorage.getItem(
'accessToken'
)}`
);
// load your response data into a Buffer
let buffer = Buffer.from(response.body.text)
// open the file in writing mode
fs.open('/path/to/my/file.pdf', 'w', function(err, fd) {
if (err) {
throw 'could not open file: ' + err;
}
// write the contents of the buffer
fs.write(fd, buffer, 0, buffer.length, null, function(err) {
if (err) {
throw 'error writing file: ' + err;
}
fs.close(fd, function() {
console.log('file written successfully');
});
});
});
};
您可能需要尝试使用缓冲区编码,默认为utf8
。
阅读本文!
您可能需要考虑的另一个选项是在服务器上生成PDF,只需向客户端发送一个链接即可下载该文件。