node.js - POST文件时如何在服务器上存储更多信息?
问题描述
这是我uploadRouter.js
用来将图像发布到服务器的我:
const express = require('express');
const bodyParser = require('body-parser');
const authenticate = require('../authenticate');
const multer = require('multer');
const cors = require('./cors');
const Images = require('../models/images');
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, 'public/images');
},
filename: (req, file, cb) => {
cb(null, file.originalname)
}
});
const imageFileFilter = (req, file, cb) => {
if(!file.originalname.match(/\.(jpg|jpeg|png|gif)$/)) {
return cb(new Error('You can upload only image files!'), false);
}
cb(null, true);
};
const upload = multer({ storage: storage, fileFilter: imageFileFilter});
const uploadRouter = express.Router();
uploadRouter.use(bodyParser.json());
uploadRouter.route('/')
.post(cors.corsWithOptions, authenticate.verifyUser, authenticate.verifyAdmin, upload.single('imageFile'),
(req, res) => {
Images.create(req.body)
.then((image) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'application/json');
res.json(req.file);
}, (err) => next(err))
.catch((err) => next(err));
})
这是我的models/image.js
文件:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var imageSchema = new Schema({
fieldname: {
type: String
},
originalname: {
type: String
},
encoding: {
type: String
},
mimetype: {
type: String
},
destination: {
type: String
},
filename: {
type: String
},
path: {
type: Boolean
},
size:{
type: Number
}
}, {
timestamps: true
});
var Images = mongoose.model('Image', imageSchema);
module.exports = Images ;
当我尝试使用 Postman 发布图像时,成功发布后,我得到如下结果:
{
"fieldname": "imageFile",
"originalname": "home_header.jpg",
"encoding": "7bit",
"mimetype": "image/jpeg",
"destination": "public/images",
"filename": "home_header.jpg",
"path": "public\\images\\home_header.jpg",
"size": 58277
}
但是当我向https://localhost:3443/images/端点发送 GET 请求时,我得到了以下结果:
[
{
"_id": "5e8ef5fa98c70f30a8986070",
"createdAt": "2020-04-09T10:16:26.796Z",
"updatedAt": "2020-04-09T10:16:26.796Z",
"__v": 0
},
{
"_id": "5e8efb70070f0b39103cba71",
"createdAt": "2020-04-09T10:39:44.196Z",
"updatedAt": "2020-04-09T10:39:44.196Z",
"__v": 0
},
{
"_id": "5e90150dd9812057f81784f3",
"createdAt": "2020-04-10T06:41:17.633Z",
"updatedAt": "2020-04-10T06:41:17.633Z",
"__v": 0
}
]
然后我看不到我需要在客户端知道的其他字段,例如 , 等filename
。originalname
那么如何将这些额外的字段与_id
andcreatedAt, updatedAt, __v
字段一起存储呢?
解决方案
在您的 POST 请求处理程序中,Image.create
使用req.file
而不是调用req.body
,如下所示:
uploadRouter.route('/')
.post(cors.corsWithOptions, authenticate.verifyUser, authenticate.verifyAdmin, upload.single('imageFile'),
(req, res) => {
Images.create(req.file)
.then((image) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'application/json');
res.json(req.file);
}, (err) => next(err))
.catch((err) => next(err));
});
推荐阅读
- html - 您可以编写一些自定义 CSS 来相应地格式化 Web 表单应用程序吗
- c# - 如何将 EmguCV 的 XFeatures2D 与 Visual Studio 2019 NuGet 结合使用?
- tcl - 如何检查 3 个或更多变量是否在 tcl 中包含相同的值
- java - 从 JavaCard 验证 RSA 签名时出现 Java SignatureException
- r - 如何实现for循环以将选项卡顺序添加到xlsx?
- kubernetes - 如何使用 kustomize 将内存中的存储替换为持久存储
- python - 如何知道一个数组的值是否存在于另一个数组中?
- javascript - 如何将值传递到我的数据库?(React JS、MongoDB、MERN 方法)
- angular - 角度数据未加载
- mysql - MySql 查询在 3 个表上相交