Node.js 使用Node、Express和Multer将文件上载到MongoDB?我应该使用什么,Multer还是GRIDfs?
你好,我正在heroku上运行最后一个项目,使用MongoLab和Multer上传照片似乎效果不错,但几小时后,照片从页面上消失,但留下了img占位符和另一个字段,如名称或日期区域 这是Heroku或Mongolab的问题,还是仅仅是免费帐户?这是因为免费帐户。此外,不管上传了一张照片还是十几张照片,它们在一段时间后仍然会消失 你能帮我吗?是否有一个黑客,棘手的代码行或东西,我犯了错误的Multer或我的数据库?我对web和堆栈溢出进行了深入的研究,我发现了一种叫做GRIDfs的东西,但我不知道这是否有效。你能告诉我我的情况吗 这是我的Multer代码:Node.js 使用Node、Express和Multer将文件上载到MongoDB?我应该使用什么,Multer还是GRIDfs?,node.js,mongodb,mongoose,gridfs,multer,Node.js,Mongodb,Mongoose,Gridfs,Multer,你好,我正在heroku上运行最后一个项目,使用MongoLab和Multer上传照片似乎效果不错,但几小时后,照片从页面上消失,但留下了img占位符和另一个字段,如名称或日期区域 这是Heroku或Mongolab的问题,还是仅仅是免费帐户?这是因为免费帐户。此外,不管上传了一张照片还是十几张照片,它们在一段时间后仍然会消失 你能帮我吗?是否有一个黑客,棘手的代码行或东西,我犯了错误的Multer或我的数据库?我对web和堆栈溢出进行了深入的研究,我发现了一种叫做GRIDfs的东西,但我不知道
var express = require("express"),
body_parser = require("body-parser"),
multer = require("multer"),
mongoose = require("mongoose");
var app = express();
//connect my local database to MongoLab database
var url = process.env.DATABASE || "mongodb://localhost/black_hat";
mongoose.connect(url);
多机配置
var storage = multer.diskStorage({
destination: function(req, file, callback){
callback(null, "./public/uploads");
},
filename: function(req, file, callback){
callback(null, Date.now() + file.originalname);
}
});
var upload = multer({storage : storage}).single("image");
我的邮政路线
app.post("/fotos_videos", isLoggedIn, function(req, res) {
upload(req, res, function(err) {
if(err){
return res.end("Error uploading file");
}
// get data from form
var newName = req.body.name,
newCover = "/uploads/" + req.file.filename;
// Packing into an object
var newCollage = {
name : newName,
cover: newCover
};
//create new album
Collage.create(newCollage, function(err, collage) {
if(err){
console.log(err);
} else {
// console.log(collage);
res.redirect("/fotos_videos");
}
});
});
});
我上传图片的表单
唱片集名称
选择专辑封面
上传
我不知道这是否有用。但据我所知,multer是用来从用户那里获取数据的东西(比如上传的图像)。它不做持久存储。如果要存储数据(像图像这样的大文件),应该使用
一旦数据从用户处传入,您应该创建一个到GridFs的读取流。如果要将图像保存到db,则u不应具有“dest”属性。multer的实现也是错误的,可能是因为这是一个老问题,以前的api就是这样。这是你应该做的 配置您的multer:
const multer = require("multer");
const upload = multer({
limits: { fileSize: 5000000 },
fileFilter(req, file, cb) {
if (!file.originalname.match(/\.(jpg|jpeg|png)$/)) { //allowed file extensions
return cb(new Error("please upload png,jpeg or jpg"));
}
cb(undefined, true);
}
});
然后创建一个端点。你已经有这个了
app.post("/fotos_videos", isLoggedIn, function(req, res) {
upload(req, res, function(err) {
这一实施是错误的。upload是一个中间件,如果您想添加身份验证,则只有经过身份验证的用户才能访问此端点。所以我们需要调整这个端点
你还需要为上传定义一个模式,以便将它们保存到数据库中。假设您创建了一个名为uploads的模型,并将其添加到其中。我们不需要用猫鼬来验证它,因为multer已经处理好了。确保从multer配置中删除dest属性。因为如果不删除,multer会将文件保存到文件夹中,因此我们的async(req,res){}
函数将无法访问该文件,因此我们无法将其保存到数据库中
上载:{type:Buffer}//将其包含在上载架构中
然后在这个文件中调用Uploads模型
router.post(
"/fotos_videos/me/uploads", isLoggedIn,
upload.single("uploads"), //uploads is just a random name when u upload from postman, form form-data,put "uploads" in key field
async (req, res) => {
req.upload.uploads = req.file.buffer;//i explain down below
await req.upload.save();
res.send();
},
(err, req, res) => {
res.status(400).send("error happned");
}
);
我们不将图片存储在文件系统中。原因是几乎所有的部署平台都要求我们将代码推送到服务器上的存储库中。因此,每次部署时文件系统都会被擦除,这意味着我们在部署时会丢失数据。因此,我们不再将图像存储在文件系统中,而是将一个字段添加到用户模型中,以将二进制数据的图像存储在数据库中
现在是时候从数据库中获取我们的图像了。为此,你需要有一条新的路线
router.get("/fotos_videos/:id/uploads", async (req, res) => {
try {
const upload = await Uploads.findById(req.params.id);
if (!upload || !upload.uploads) {
throw new Error("no image found");
}
res.set("Content-Type", "image/png");
res.send(upload.uploads);
} catch (e) {
res.status(400).send(e.message);
}
});
感谢@jackblack的评论,我想要持久存储。我已经找到了gridfs流,但是你能给我举个例子吗?你已经明白我的问题了!!我想要实现的是,用户上传一张照片和关于该照片的描述,然后在web浏览器中向我显示该信息(图片和描述),然后用户可能想要编辑或删除该照片。就像CRUD应用程序一样,我使用mongoose和Multer实现了这一功能,但正如您所看到的,这不适用于实现数据持久性。任何帮助都将是免费的welcome@CarlosMoreno您可以使用gridfs流,并且可以像使用multer进行普通文件上载一样上载和下载图像。哪一个更好我仍然困惑我也在寻找答案:)