html - 在 nodejs 中使用 multer
问题描述
我正在尝试将文件从我的页面上传到节点服务器。
我可以看到表单数据正在到达服务器上的路由器。
但是没有文件保存在上传文件夹中。
我究竟做错了什么?
//路由器单元
const express = require('express');
const router = express.Router();
const multer = require('multer');
const storage = multer.diskStorage({
destination: (req, file, cb) => {
console.log('chegei')
cb(null, "uploads/")
},
filename: (req, file, cb) => {
console.log('chegei2')
cb(null, Date.now() + "-" + file.ogirinalname)
},
});
module.exports = function (page) {
router.post('/SendMsgBase64', async (req, res) => {
var upload = multer({ storage: storage }).single('userFile');
upload(req, res, function (err) {
if (err) {
console.log(err);
return res.send({ "data": "Error uploading file." });
}
return res.send({ "data": "File is uploaded" });
});
return router
}
//app.js 单元
const express = require('express')
const app = express()
const server = require('http').Server(app)
const io = require('socket.io')(server)
const WARoutes = require('../routes/WARoutes');
const path = require('path');
const bodyParser = require('body-parser');
app.use(bodyParser.json()); // support json encoded bodies
app.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies
app.use(express.urlencoded({ extended: true }))
app.get('/', (req, res) => {
res.sendFile('/index.html');
})
app.use('/whats', WARoutes(this.page));
//html
<form id="uploadForm">
<input type="file" name="userFile" />
<input type="button" value="Upload Image" onclick="uploadFile();">
<span id="status"></span>
</form>
<script>
uploadFile = () => {
var formData = new FormData();
debugger
var logoImg = $('input[name="userFile"]').get(0).files[0];
formData.append('logo', logoImg);
var objArr = [];
objArr.push({ "id": "123", "name": "luiz" });
//JSON obj
formData.append('objArr', JSON.stringify(objArr));
$.ajax({
url: "/whats/SendMsgBase64",
type: "POST",
processData: false,
contentType: "application/x-www-form-urlencoded",
data: formData,
complete: function (data) {
alert("success");
}
})
};
</script>
解决方案
根据multer的github页面,如果你没有创建uploads目录,可能会出错。
如果是这种情况,您自己创建目录或将字符串值传递给目标属性是您的解决方案。
https://github.com/expressjs/multer
注意:在将目标提供为函数时,您有责任创建目录。传递字符串时,multer 将确保为您创建目录。
推荐阅读
- swift - 为什么 Firebase Analytics 数据不显示在 BigQuery 中?
- c# - 如何根据输入字段的值统一更改场景
- python - pylint 似乎不适用于数据类中定义的字典
- python - 查询相关模型时避免在 Flask/SQLAlchemy 中循环导入
- c++ - 项目坐标更改时如何更新 QGraphicsScene
- c++ - 在 dev-c++ 中将数组放在一起
- c# - 在 C# / ASP.NET 中异步检查 Internet
- javascript - 如何根据与其他表的多对多关系过滤掉元素?
- r - 如何在 R 中找到回报率。我按月按数据分组
- php - 致命错误:未捕获的错误:无法将 stdClass 类型的对象用作数组