Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js上传和下载pdf文件_Javascript_Node.js_Mongodb_Gridfs_Gridfs Stream - Fatal编程技术网

Javascript node.js上传和下载pdf文件

Javascript node.js上传和下载pdf文件,javascript,node.js,mongodb,gridfs,gridfs-stream,Javascript,Node.js,Mongodb,Gridfs,Gridfs Stream,框架:node.js/express.js/busboy/gridfs流(mongodb) 我使用busboy上传文件,然后使用gridfs流在mongodb gridfs中存储文件 req.pipe(req.busboy); req.busboy.on('file', function (bus_fieldname, bus_file, bus_filename) { var writestrea

框架:node.js/express.js/busboy/gridfs流(mongodb)

我使用busboy上传文件,然后使用gridfs流在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。这是不匹配的。文本文件不会发生这种情况。当然,这与数据类型有关


有人能帮忙吗?

将gfs读取流直接传送到响应。这对我来说很有用

res.set("Content-Disposition","attachment; filename=" + fileName);
var readstream = gfs.createReadStream({_id: attachmentid});
readstream.pipe(res);

就像Sasikanth说的,你可以用管道解决问题,这是最好的方法

但是如果您想知道当前的方法有什么问题,那么我建议您阅读文档。您将变量命名为
buffer
,但指定字符串

然后在
数据
回调中添加带缓冲区的字符串。执行此操作时,
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));
});

感谢您的解释…您的解决方案非常好。