使用 gridfs-stream 将文件直接存储在 mongodb 中
stored files directly in mongodb with gridfs-stream
我需要将一些文件保存到 mongodb,所以我使用 gridfs-stream 和 express.js
var file = req.files.file;
req.pipe(gfs.createWriteStream({
filename:file.originalname,
mode:"w",
chunkSize:1024*4,
content_type:file.mimetype,
root:"fs"
})
res.send(200);
为了测试,我使用邮递员并以这种方式设置 POST 请求:
POST /fs/upload HTTP/1.1
Host: localhost:5000
Cache-Control: no-cache
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="file"; filename="epic.png"
Content-Type: image/png
----WebKitFormBoundaryE19zNvXGzXaLvS5C
问题是这种方式只是存储文件的数据:
{
"_id" : ObjectId("54d14ec5b102fe401519a3c1"),
"filename" : "epic.png",
"contentType" : "image/png",
"length" : 0,
"chunkSize" : 4096,
"uploadDate" : ISODate("2015-02-03T22:42:14.730Z"),
"aliases" : null,
"metadata" : null,
"md5" : "993fb9ce262a96a81c79a38106147e95"
}
但不是内容,我指的是它的二进制数据,存储在 mongodb 中,属性长度等于 0,因为 fs.chucks.[=14 中没有任何块=]
阅读博客找到了使用 express.js、gridfs-stream.js 和 multer 中间件直接在数据库中传输数据的答案:
var multer = require('multer');
app.post('/fs/upload', multer({
upload: null,// take uploading process
onFileUploadStart: function (file) {
//set upload with WritableStream
this.upload = gfs.createWriteStream({
filename: file.originalname,
mode: "w",
chunkSize: 1024*4,
content_type: file.mimetype,
root: "fs"
});
},
onFileUploadData: function (file, data) {
//put the chucks into db
this.upload.write(data);
},
onFileUploadComplete: function (file) {
//end process
this.upload.on('drain', function () {
this.upload.end();
});
}
}), function (req, res) {
res.sendStatus(200);
});
为了测试这个:
app.route('/fs/download/:file').get(function (req, res) {
var readstream = gfs.createReadStream({_id: req.params.file});
readstream.pipe(res);
});
我需要将一些文件保存到 mongodb,所以我使用 gridfs-stream 和 express.js
var file = req.files.file;
req.pipe(gfs.createWriteStream({
filename:file.originalname,
mode:"w",
chunkSize:1024*4,
content_type:file.mimetype,
root:"fs"
})
res.send(200);
为了测试,我使用邮递员并以这种方式设置 POST 请求:
POST /fs/upload HTTP/1.1
Host: localhost:5000
Cache-Control: no-cache
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="file"; filename="epic.png"
Content-Type: image/png
----WebKitFormBoundaryE19zNvXGzXaLvS5C
问题是这种方式只是存储文件的数据:
{
"_id" : ObjectId("54d14ec5b102fe401519a3c1"),
"filename" : "epic.png",
"contentType" : "image/png",
"length" : 0,
"chunkSize" : 4096,
"uploadDate" : ISODate("2015-02-03T22:42:14.730Z"),
"aliases" : null,
"metadata" : null,
"md5" : "993fb9ce262a96a81c79a38106147e95"
}
但不是内容,我指的是它的二进制数据,存储在 mongodb 中,属性长度等于 0,因为 fs.chucks.[=14 中没有任何块=]
阅读博客找到了使用 express.js、gridfs-stream.js 和 multer 中间件直接在数据库中传输数据的答案:
var multer = require('multer');
app.post('/fs/upload', multer({
upload: null,// take uploading process
onFileUploadStart: function (file) {
//set upload with WritableStream
this.upload = gfs.createWriteStream({
filename: file.originalname,
mode: "w",
chunkSize: 1024*4,
content_type: file.mimetype,
root: "fs"
});
},
onFileUploadData: function (file, data) {
//put the chucks into db
this.upload.write(data);
},
onFileUploadComplete: function (file) {
//end process
this.upload.on('drain', function () {
this.upload.end();
});
}
}), function (req, res) {
res.sendStatus(200);
});
为了测试这个:
app.route('/fs/download/:file').get(function (req, res) {
var readstream = gfs.createReadStream({_id: req.params.file});
readstream.pipe(res);
});