Node.js multer无法存储文件和字符串数据



我正在使用Node.js和multer来存储文件,但无法保存它们。

从React端,我使用post请求以formdata的形式发送数据,浏览器显示文件和数据,节点接收请求并在req中。

我尝试了upload.any(), upload.array(),但没有显示req中的文件。File或req.files。当我尝试upload.single("filename")时,控制台显示数据。

我已经检查了要求。文件-显示:

name: '783px-Test-Logo.svg.png',
data: <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 03 0f 00 00 01 67 08 06 00 00 00 e0 e4 75 c8 00 00 11 22 33 41 4d 41 00 00 b1 8f 0b fc 61 05 00 ... 18403 more bytes>,
size: 18453,
encoding: '7bit',
tempFilePath: '',
truncated: false,
mimetype: 'image/png',
md5: '6a78913c131cfcd539813bd4b7c42459',
mv: [Function: mv]
}

所以我在这里从浏览器获取文件,但问题是它正在创建一个空的存储文件夹。

这些是我的多重配置:

const userTypes = require("../internal/users/consts/userTypes");
const middlewares = require("../api/middlewares");
const AssignmentsApi = require("../api/assignment");
const multer = require('multer');

let storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './storage')
},
filename: function (req, file, cb) {
cb(null, file.originalname + '-' + Date.now())
}
});
const upload = multer({ storage });
module.exports = app => {
const assignmentRouter = express.Router();
assignmentRouter.use(middlewares.AuthMiddleware);
assignmentRouter
.route("/uploadnew")
.post(middlewares.UserRolesMiddleware(userTypes.teacher),  upload.any(), function(req, res, next) {
if (req.file) {
console.dir("req.file", req.file);
console.log("uploadnew files", req.file.assignmentFile);
return res.end("Thank you for the file");
} else if (req.files) {
console.dir("req.files", req.files);
console.log("uploadnew files", req.files.assignmentFile);
return res.end("Thank you for the files");
}
res.end("Missing file");
}); 
}```

文档中:

注意:当目标作为函数提供时,您负责创建目录。当传递一个字符串时,multer将确保为您创建目录。

提供一个函数作为目标。我建议您在调用回调之前检查函数中是否存在文件夹。例子:

let storage = multer.diskStorage({
destination: function (req, file, cb) {
const dir = './storage';
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir);
}
cb(null, dir);
},
filename: function (req, file, cb) {
cb(null, file.originalname + '-' + Date.now())
}
});

我可以看到,您没有使用path.join(…)使用下面这样的代码片段(参见第6行)。只需替换为你的文件夹的相对路径,并覆盖你想要的东西。

const path = require('path');
multer({
storage: multer.diskStorage({
destination: function (req, file, cb) {
// IMPORTANT: don't forget to use path.join(....)
const filePath = path.join(__dirname, `./storage`);
cb(null, filePath);
},
filename: (req, file, cb) => {
const extension = file.mimetype.split('/')[1];
const dateField = (new Date().getTime() / 1000 | 0);
const randomField = Math.random().toString(36).substring(2);
const fileName = `${dateField}-${randomField}.${extension}`;
return fileName;
},
}),
limits: {
fileSize: 1024 * 1024 * 10 // MB
},
fileFilter: (req, file, cb) => {
let isValid = (file.mimetype === 'image/jpeg' ||
file.mimetype === 'image/jpg' ||
file.mimetype === 'image/png');
cb(null, isValid);
},
});

确保你有相同的"文件名"。在HTML中。例如,对于多张图片上传你需要像这样输入

<input type="file" name="filename" multiple>

中间件应该是这样的:

router.post('/upload-images', upload.array('filename', 10), (req, res) => { ... });

注意:要查看上传的文件,不要忘记在此之前定义它们的公共URL(例如):

app.use('/storage', express.static(path.join(__dirname, 'storage')));

最新更新