我试图找出如何将图像直接发布到GridFS而不将其作为临时文件存储在服务器上的任何位置.
我使用Postman(chrome ext.)发布文件,我设法将此帖子存储为文件,使用:
req.pipe(fs.createWriteStream('./test.png'));
Run Code Online (Sandbox Code Playgroud)
当从服务器上的文件创建readStream时,我还能够从readStream直接存储到GridFS.(见代码)
我有以下文件,saveFromReq.js它们监听POST,基本上只是将其传递给savePic.js.
saveFromReq.js:
var express = require('express');
var app = express();
var savePic = require('./savePic');
var fs = require('fs');
var GridStore = require('mongodb').GridStore;
var pic = './square.png';
var picID;
//When the following
//var pic = fs.createReadStream('./square.png', {autoClose: true});
//is not commented out, and 'req' is replaced with 'pic' in the savePic function,
//the file square.png is stored correctly to GridFS
app.post('/picture', function(req, res){
savePic(req, function(id){});
res.writeHead(200, {'Content-Type': 'text' });
res.end("Sucsess!\n");
});
app.listen(process.env.PORT …Run Code Online (Sandbox Code Playgroud) 我有这个错误信息:
(node:11976) DeprecationWarning: GridStore is deprecated, and will be removed in a future version. Please use GridFSBucket instead
Run Code Online (Sandbox Code Playgroud)
有时我无法查看图片,我想正因为如此,由于文档不佳,我不知道如何将我的代码切换到 GridFSBucket,就是这样:
conn.once("open", () => {
// Init stream
gfs = Grid(conn.db, mongoose.mongo);
//gfs = new mongoose.mongo.GridFSBucket(conn.db);
gfs.collection("user_images");
});
var storageImage = new GridFsStorage({
url: dbURI,
options: { useNewUrlParser: true, useUnifiedTopology: true },
file: (req, file) => {
return new Promise((resolve, reject) => {
crypto.randomBytes(16, (err, buf) => {
if (err) {
return reject(err);
}
const filename = buf.toString("hex") + path.extname(file.originalname);
const …Run Code Online (Sandbox Code Playgroud) 我正在尝试在node.js应用程序中设置文件API.我的目标是能够将文件流直接写入gridfs,而无需最初将文件存储到磁盘.好像我的创建代码正在运行.我能够将文件上传保存到gridfs.问题是正在读取文件.当我尝试通过Web浏览器窗口下载保存的文件时,我看到文件内容包含如下内容:
------WebKitFormBoundarye38W9pfG1wiA100l
Content-Disposition: form-data; name="file"; filename="myfile.txt"
Content-Type: text/javascript
***File contents here***
------WebKitFormBoundarye38W9pfG1wiA100l--
Run Code Online (Sandbox Code Playgroud)
所以我的问题是在将文件流保存到gridfs之前,我需要做些什么来从文件流中去除边界信息?这是我正在使用的代码:
'use strict';
var mongoose = require('mongoose');
var _ = require('lodash');
var Grid = require('gridfs-stream');
Grid.mongo = mongoose.mongo;
var gfs = new Grid(mongoose.connection.db);
// I think this works. I see the file record in fs.files
exports.create = function(req, res) {
var fileId = new mongoose.Types.ObjectId();
var writeStream = gfs.createWriteStream({
_id: fileId,
filename: req.query.name,
mode: 'w',
content_type: req.query.type,
metadata: {
uploadedBy: req.user._id,
}
});
writeStream.on('finish', function() {
return res.status(200).send({ …Run Code Online (Sandbox Code Playgroud) 我有来自mongoDB的以下带有图像的JSON,但我不知道如何显示它:
fs.chunks:
{
"_id" : ObjectId("542e684a8a1cec178a172673"),
"n" : 1,
"data" : BinData(0,"2N6DSSfbCN/LLacNDYrJUQDEZgimMUwFpQGoJP0RU19Bi4PM82DjrUnKhE/P9v7P8ZveD1oDpFBM0iml9NE3WQmAvYFoG+nhD73Jm4N9b4LpylaAN5Ef+gVdgGSTAfSUwOikXoVick5pSQCkRmTCU5NT9VVfjHdAx74/ZhFRj+TIRjzlAhzkACBElzgMwGCo7tX+FYrpQLJ5KRmXiwFFwsNtHHzXiK1eu+CG1FumhGpA/qdG8CdDgD1xUHEcerMGO/eLGR9ML7ni/VjXxWzqp2j5DG2/WuKNv7xd3Kz/vr0MctJhuaBIl35YrKhdLnzqDa0uDa6bm4jz+eNyAI2hQbayGo4kVPFe8W7wFpY7qfBvnB9kbocxfZSdADDUNwYaydpT8lIcKEN9XfQJOYZvHp0El"),
"files_id" : ObjectId("542e684a8a1cec178a172671")
}
fs.files:
{
"_id" : ObjectId("542e65378axdeckhb0"),
"uploadDate" : ISODate("2012-11-01"),
"length" : 15673,
"chunkSize" : 33222,
"md5" : "f66e6654854a28e3672cfhds334d223b55a1"
}
Run Code Online (Sandbox Code Playgroud)
需要将“数据”转换为真实图像才能显示。
我正在使用nodeJS,但找不到很好的教程来通过GridFS从mongoDB检索图像。
谢谢你的帮助!
我正在尝试在 nodejs 中编写一个程序,该程序在 mongodb 中存储文件列表。它工作正常,但有一个问题:它总是将 contentType 元数据存储为二进制/八位字节流,我希望它存储实际的 MIME 类型。我尝试在 readStream 之前获取 mime 类型(通过 promises),但即使我对 contentType 进行硬编码(例如“image/jpeg”),它也总是将元数据保存为“binary/octet-stream。
这是我的代码:
files.forEach(function(f) {
var conn = mongoose.createConnection(db);
conn.once('open', function () {
var gfs = Grid(conn.db);
var writeStream = gfs.createWriteStream({
filename: f.location,
mode: 'w',
contentType: 'image/jpeg'
});
writeStream.on('finish', function() {
console.log('Storing', f.location, 'OK');
return;
})
.on('error', function(data) {
console.log('Error', f.location, data)
});
fs.createReadStream(path.join(__dirname, 'files', f.location), 'utf-8')
.pipe(writeStream);
});
});
Run Code Online (Sandbox Code Playgroud)
任何的想法?谢谢您的反馈!
我运行Express 4的使用multer,GridFS的流和猫鼬用MongoDB中,我尝试上传的文件,并将其流式传输到GridFS的.
执行此操作的快速路由定义为:
app.post('/uploadfile', function (req, res) {
console.dir(req.files);
// The mongodb instance created when the mongoose.connection is opened
var db = mongoose.connection.db;
// The native mongo driver which is used by mongoose
var mongoDriver = mongoose.mongo;
// Create a gridfs-stream
var gfs = new Gridfs(db, mongoDriver);
var file = req.files.myFile;
var fileId = new ObjectId();
console.log("Creating WriteStream");
var writeStream = gfs.createWriteStream({
_id: fileId,
filename: file.originalname,
mode: 'w',
content_type: file.mimetype,
metadata: {
id: '123', …Run Code Online (Sandbox Code Playgroud) 使用gridfs-stream,查找和获取文件时如何指定bucket名称?
我的问题是在如何指定 GridFS 存储桶的stackoverflow 上找到的以下问题的后续问题
那里的解决方案提供了一个示例,说明如何在调用 createWriteStream 时指定存储桶。根据@vsivsi 提供的代码,我可以使用以下代码中的“root”选项将文件添加到我的自定义存储桶中:
// fyi, req.file has been populated using multer
var gfs = Grid(mongoose.connection.db);
var writeStream = gfs.createWriteStream({
filename: req.file.originalname,
mode: 'w',
content_type: req.file.mimetype,
root: 'private'
});
Run Code Online (Sandbox Code Playgroud)
这成功地将我的文件添加到 private.files 和 private.chunks。所以现在我想查找并阅读我上传的文件。我的 find() 不使用存储桶,如下所示:
var gfs = Grid(mongoose.connection.db);
gfs.find({
filename: req.params.filename
}).toArray(function(err, files){
// bunch of processing here...
});
Run Code Online (Sandbox Code Playgroud)
现在我如何知道要查询哪个存储桶/根?
我假设在调用 createReadStream() 时我将能够使用相同的“root”选项,但首先我需要找到它。有没有办法告诉 gridfs-stream 使用哪个存储桶/根?