node.js上传下载pdf文件
Posted
技术标签:
【中文标题】node.js上传下载pdf文件【英文标题】:node.js upload and download pdf file 【发布时间】:2015-09-19 12:00:22 【问题描述】:框架:node.js/express.js/busboy/gridfs-stream(mongodb)
我正在使用 busboy 上传文件,然后使用 gridfs-stream 将文件存储在 mongodb gridfs 中。
req.pipe(req.busboy);
req.busboy.on('file', function (bus_fieldname, bus_file, bus_filename)
var writestream = gfs.createWriteStream(
filename: bus_filename,
);
bus_file.pipe(writestream);
writestream.on('close', function (file)
res.redirect('/xxxxx/');
);
);
下载很简单:使用gridfs-stream的createReadStream我从mongodb读取内容,然后使用下面的代码发送到浏览器。
gfs.findOne(_id: attachmentid, function (err, file)
if (err || !file)
res.send(404);
else
var fileName = file.filename;
var readstream = gfs.createReadStream(_id: attachmentid);
var buffer = "";
readstream.on("data", function (chunk)
buffer += chunk;
);
// dump contents to buffer
readstream.on("end", function ()
res.set("Content-Disposition","attachment; filename=" + fileName);
res.send(buffer);
);
问题:当我上传一个 90kb 的 pdf 文件时,它可以正常上传。我在 mongodb 中看到大小是正确的。但是当我下载时,下载文件的文件大小约为165kb。存在不匹配。文本文件不会发生这种情况。当然它与数据类型有关。
有人可以帮忙吗?
【问题讨论】:
【参考方案1】:将 gfs 读取流直接传送到响应。这对我有用
res.set("Content-Disposition","attachment; filename=" + fileName);
var readstream = gfs.createReadStream(_id: attachmentid);
readstream.pipe(res);
【讨论】:
【参考方案2】:就像 Sasikanth 说的,你可以解决管道问题,这是最好的方法。
但是,如果您想知道您当前的方法有什么问题,那么我建议您阅读 Buffer 文档。您将变量命名为 buffer
但分配字符串。
然后在您的data
回调中,您正在添加带有缓冲区的字符串。当您这样做时,chunk
缓冲区将使用它的 toString()
方法转换为字符串。所以你的二进制数据被转换为 utf8 编码的字符串,在这里它出错了。由于 utf8 是多字节编码,输出大小变大(我不知道这种转换的确切机制)。
所以正确的做法是将其保存在缓冲区中:
var buffers = [];
readstream.on("data", function (chunk)
buffers.push(chunk)
);
readstream.on("end", function ()
res.set("Content-Disposition","attachment; filename=" + fileName);
res.send(Buffer.concat(buffers));
);
【讨论】:
感谢您的解释...您的解决方案很棒。以上是关于node.js上传下载pdf文件的主要内容,如果未能解决你的问题,请参考以下文章