使用文本输入上传文件的最佳方式
Best way to upload file with text inputs
我正在尝试创建一个项目,用户可以在其中上传文件图像,将文件上传到 amazon s3,returns 应该传递给图像地址的字符串 mongoDB 作为单个文档连同文本输入,例如项目名称、描述、日期等
到目前为止,我已经创建了一个带有名称和图像的简单 mongoDB 模型来测试使用一个文本输入上传文件,但是当我尝试在邮递员中使用 form 对其进行测试时-urlencoded,没有 select 文件的选项,如果我尝试在 form-data 中测试它,我会得到一个空字符串名称输入,但我的代码确实读取了文件和 return 文件的字符串,只是两者不同。
我的代码是:
亚马逊 s3 的设置文件
const multer = require("multer");
const multerS3 = require("multer-s3");
const { secret_key, access_key, bucket_name } = require("../config/config");
aws.config.update({
secretAccessKey: secret_key,
accessKeyId: access_key,
region: "us-east-2"
});
const s3 = new aws.S3();
const fileFilter = (req, file, cb) => {
if (file.mimetype === "image/jpeg" || file.mimetype === "image/png") {
cb(null, true);
} else {
cb(new Error("Invalid Mime Type, only JPEG or PNG"), false);
}
};
const upload = multer({
fileFilter: fileFilter,
storage: multerS3({
s3: s3,
bucket: bucket_name,
acl: "public-read",
metadata: function(req, file, cb) {
cb(null, { fieldName: file.fieldname });
},
key: function(req, file, cb) {
cb(null, Date.now().toString());
}
})
});
module.exports = upload;
目标路由上传控制器文件
const upload = require("../services/file-upload");
const singleUpload = upload.single("img");
let uploadArtefact = (req, res) => {
const { name } = req.body;
singleUpload(req, res, err => {
if (err) {
return res.status(422).send({
errors: [{ title: "File Upload Error", detail: err.message }]
});
}
let artefact = new Artefact({
name: name,
img: req.file.location
});
if (!name) {
return res.json({
success: false,
error: "Invalid Inputs"
});
}
artefact.save(err => {
if (err) {
return res.json({ sucess: false, error: err });
}
return res.json({ success: true });
});
});
};
module.exports = uploadArtefact;
所以我想知道最好的方法是什么?有没有办法在一个请求中提交带有文本的文件?我希望能够找到一种方法将它们一起发送。
没关系,我意识到 multer 可以解析文本,但我只需要将 const { name } = req.body;
放在 singleUpload{}
部分中。
我正在尝试创建一个项目,用户可以在其中上传文件图像,将文件上传到 amazon s3,returns 应该传递给图像地址的字符串 mongoDB 作为单个文档连同文本输入,例如项目名称、描述、日期等
到目前为止,我已经创建了一个带有名称和图像的简单 mongoDB 模型来测试使用一个文本输入上传文件,但是当我尝试在邮递员中使用 form 对其进行测试时-urlencoded,没有 select 文件的选项,如果我尝试在 form-data 中测试它,我会得到一个空字符串名称输入,但我的代码确实读取了文件和 return 文件的字符串,只是两者不同。
我的代码是: 亚马逊 s3 的设置文件
const multer = require("multer");
const multerS3 = require("multer-s3");
const { secret_key, access_key, bucket_name } = require("../config/config");
aws.config.update({
secretAccessKey: secret_key,
accessKeyId: access_key,
region: "us-east-2"
});
const s3 = new aws.S3();
const fileFilter = (req, file, cb) => {
if (file.mimetype === "image/jpeg" || file.mimetype === "image/png") {
cb(null, true);
} else {
cb(new Error("Invalid Mime Type, only JPEG or PNG"), false);
}
};
const upload = multer({
fileFilter: fileFilter,
storage: multerS3({
s3: s3,
bucket: bucket_name,
acl: "public-read",
metadata: function(req, file, cb) {
cb(null, { fieldName: file.fieldname });
},
key: function(req, file, cb) {
cb(null, Date.now().toString());
}
})
});
module.exports = upload;
目标路由上传控制器文件
const upload = require("../services/file-upload");
const singleUpload = upload.single("img");
let uploadArtefact = (req, res) => {
const { name } = req.body;
singleUpload(req, res, err => {
if (err) {
return res.status(422).send({
errors: [{ title: "File Upload Error", detail: err.message }]
});
}
let artefact = new Artefact({
name: name,
img: req.file.location
});
if (!name) {
return res.json({
success: false,
error: "Invalid Inputs"
});
}
artefact.save(err => {
if (err) {
return res.json({ sucess: false, error: err });
}
return res.json({ success: true });
});
});
};
module.exports = uploadArtefact;
所以我想知道最好的方法是什么?有没有办法在一个请求中提交带有文本的文件?我希望能够找到一种方法将它们一起发送。
没关系,我意识到 multer 可以解析文本,但我只需要将 const { name } = req.body;
放在 singleUpload{}
部分中。