我想在我的 nodejs 應用程式中使用 multer 來上傳用戶個人資料圖片。我的路線由快速路由器管理。我檢查了很多教程,但沒有一個符合我的確切用例。我想讓用戶將他們的個人資料圖片上傳到我的 API,但在請求到達上傳功能之前,我想執行一些驗證,如密碼和 API 密鑰檢查。這是我的上傳控制器,
const multer = require("multer");
const path = require("path");
const dp_storage = multer.diskStorage({
destination: path.join(__dirname, "../user_uploads/images/dp"),
filename: function (req, file, cb) {
cb(
null,
file.fieldname "-" Date.now() path.extname(file.originalname)
);
},
});
// Init dp Upload
const dp_upload = multer({
storage: dp_storage,
limits: { fileSize: 2000000 }, // 1 mb
fileFilter: function (req, file, cb) {
checkFileTypeForUserDP(file, cb);
},
}).single("dp");
function checkFileTypeForUserDP(file, cb) {
// Allowed ext
let filetypes = /jpeg|jpg|png|gif|webp/;
// Check ext
let extname = filetypes.test(path.extname(file.originalname).toLowerCase());
// Check mime
let mimetype = filetypes.test(file.mimetype);
if (mimetype && extname) {
return cb(null, true);
} else {
cb("Error: jpeg, jpg, png, gif Images Only!");
}
}
exports.uploadDP = async (req, res) => {
try {
dp_upload(req, res, (err) => {
if (err) {
console.log(err);
} else {
if (req.file == undefined) {
res.status(404).json({
success: false,
msg: "File is undefined!",
file: `uploads/${req.file.filename}`,
});
} else {
res.status(200).json({
success: true,
msg: "File Uploaded!",
file: `uploads/${req.file.filename}`,
});
}
}
});
} catch (error) {console.log(error);}
};
如果我在沒有任何 API 密鑰驗證或用戶身份驗證的情況下直接使用上面的代碼,它就可以正常作業。
這是我的路由器,
const express = require("express");
const router = express.Router();
const { authenticateUser ,apiKeyCheck} = require("../server");
const { uploadDP } = require("../controllers/file");
//this route works
router.post(
"/upload/dp_without_authentication",
uploadDP
);
//this is not working
router.post(
"/upload/dp",
apiKeyCheck,
authenticateUser,
uploadDP
);
module.exports = router;
"/upload/dp"路由失敗,因為函式apiKeyCheck and authenticateUser無法從中讀取用戶憑據req.body。所以,為了解決這個問題,我在我的主服務器檔案中添加了以下幾行,
const multer = require("multer");
const upload = multer();
app.use(upload.array());
但是現在uploadDP甚至沒有呼叫該函式,而是回傳以下錯誤:
MulterError: Unexpected field
at wrappedFileFilter (/Users/sujith/Documents/Personal_projects/VocabularyServer/node_modules/multer/index.js:40:19)
at Busboy.<anonymous> (/Users/sujith/Documents/Personal_projects/VocabularyServer/node_modules/multer/lib/make-middleware.js:115:7)
at Busboy.emit (node:events:394:28)
at Busboy.emit (/Users/sujith/Documents/Personal_projects/VocabularyServer/node_modules/busboy/lib/main.js:38:33)
at PartStream.<anonymous> (/Users/sujith/Documents/Personal_projects/VocabularyServer/node_modules/busboy/lib/types/multipart.js:213:13)
at PartStream.emit (node:events:394:28)
at HeaderParser.<anonymous> (/Users/sujith/Documents/Personal_projects/VocabularyServer/node_modules/busboy/node_modules/dicer/lib/Dicer.js:51:16)
at HeaderParser.emit (node:events:394:28)
at HeaderParser._finish (/Users/sujith/Documents/Personal_projects/VocabularyServer/node_modules/busboy/node_modules/dicer/lib/HeaderParser.js:68:8)
at SBMH.<anonymous> (/Users/sujith/Documents/Personal_projects/VocabularyServer/node_modules/busboy/node_modules/dicer/lib/HeaderParser.js:40:12)
如果我從郵遞員請求中洗掉檔案,它可以呼叫uploadDP函式。我在這里做錯了什么?
uj5u.com熱心網友回復:
最后,我讓它作業了。這是我的解決方案,
首先,我在我的主服務器檔案中添加了以下行,
app.use(multer().any());這將讓我所有的中間件訪問req.body.
現在,在我的上傳控制器中,我可以從陣列訪問檔案并使用模塊req.files手動保存檔案。fs
這是上傳控制器的最終代碼,
const fs = require("fs");
const path = require("path");
function isValidImageFile(file) {
// Allowed ext
let filetypes = /jpeg|jpg|png|gif|webp/;
let extname = filetypes.test(path.extname(file.originalname).toLowerCase());
let mimetype = filetypes.test(file.mimetype);
if (mimetype && extname) return true;
else false;
}
exports.uploadDP = async (req, res) => {
var error = undefined;
var files = req.files;
if (files && files[0]) {
const my_dp_file = files[0];
var fileToSave = path.join(
__dirname,
"../user_uploads/images/dp/"
req.user._id
path.extname(my_dp_file.originalname)
);
if (isValidImageFile(my_dp_file)) {
fs.writeFile(fileToSave, my_dp_file.buffer, function (err) {
if (err) error = err;
else res.send("file saved successfully");
});
} else error = "Not a valid image file";
} else error = "No files found";
if (error) {
console.log(error);
res.send(error);
}
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/481700.html
