【问题标题】:Cannot POST /upload while trying to load file to server. Multer尝试将文件加载到服务器时无法 POST /upload。穆尔特
【发布时间】:2020-02-16 16:27:10
【问题描述】:

我正在尝试通过 multer 中间件将文件加载到我的服务器,但服务器向我响应消息:无法 POST /upload

我的后端代码是(关于 multer 和 requests):

import multer from 'multer';

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use((req, res, next) => {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, OPTIONS");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
});
let storage = multer.diskStorage({
    destination: (req, file, cb) =>{
        cb(null, './uploads')
    },
    filename: (req, file, cb) => {
        cb(null, file.fieldname + '-' + Date.now())
    }
})

let upload = multer({ storage: storage }).single('file');

app.post('/upload', (req, res) => {
    upload(req, res, (err) =>{
        if (err) {
            return res.end("Error uploading file.");
        }
        res.end("File is uploaded");
    });
});

还有我的前端表单:

<form method="post" encType="multipart/form-data" action="/upload">
    <input type="file" name="file" />
     <input type="submit" value="Submit" />
</form>

我也尝试通过 Postman 发出请求并收到同样的错误。 也许是因为cors政策?请帮忙。

【问题讨论】:

    标签: node.js express multer


    【解决方案1】:

    现在我的后端代码是:

    let storage = multer.diskStorage({
        destination: (req, file, cb) =>{
            cb(null, './uploads')
        },
        filename: (req, file, cb) => {
            cb(null, file.fieldname + '-' + Date.now())
        }
    })
    
    let upload = multer({ storage: storage }).single('file');
    
    app.post('/upload', upload, (req, res) => {
        res.end("File is uploaded");
    });
    

    但我在浏览器中遇到同样的错误, 在邮递员我有:

    MulterError: Unexpected field
        at wrappedFileFilter (C:\Users\MAISTER\Desktop\shopping cart\shopping\backend\node_modules\multer\index.js:40:19)
        at Busboy.<anonymous> (C:\Users\MAISTER\Desktop\shopping cart\shopping\backend\node_modules\multer\lib\make-middleware.js:114:7)
        at Busboy.emit (events.js:203:13)
        at Busboy.EventEmitter.emit (domain.js:471:20)
        at Busboy.emit (C:\Users\MAISTER\Desktop\shopping cart\shopping\backend\node_modules\busboy\lib\main.js:38:33)
        at PartStream.<anonymous> (C:\Users\MAISTER\Desktop\shopping cart\shopping\backend\node_modules\busboy\lib\types\multipart.js:213:13)
        at PartStream.emit (events.js:203:13)
        at PartStream.EventEmitter.emit (domain.js:471:20)
        at HeaderParser.<anonymous> (C:\Users\MAISTER\Desktop\shopping cart\shopping\backend\node_modules\dicer\lib\Dicer.js:51:16)
        at HeaderParser.emit (events.js:203:13)
        at HeaderParser.EventEmitter.emit (domain.js:471:20)
        at HeaderParser._finish (C:\Users\MAISTER\Desktop\shopping cart\shopping\backend\node_modules\dicer\lib\HeaderParser.js:68:8)
        at SBMH.<anonymous> (C:\Users\MAISTER\Desktop\shopping cart\shopping\backend\node_modules\dicer\lib\HeaderParser.js:40:12)
        at SBMH.emit (events.js:203:13)
        at SBMH.EventEmitter.emit (domain.js:471:20)
        at SBMH._sbmh_feed (C:\Users\MAISTER\Desktop\shopping cart\shopping\backend\node_modules\streamsearch\lib\sbmh.js:159:14)
    

    【讨论】:

    • 我解决了这个问题,在 POSTMAN 请求的字段“键”中 - 需要添加表单字段“名称”的值。但在浏览器中我有同样的错误'无法发布/上传'
    • 我还解决了通过浏览器上传文件的问题。您只需将表单的操作从“上传”更改为“youserver:port/upload”
    【解决方案2】:

    您应该像这样在发布路由的定义中直接将upload 作为中间件传递

    let upload = multer({ storage: storage }).single('file');
    
    app.post('/upload', upload, (req, res) => {
            res.end("File is uploaded");
    });
    

    upload 是一个中间件,它必须在/upload 请求过程中执行的中间件列表中过去

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-14
      • 1970-01-01
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      • 1970-01-01
      相关资源
      最近更新 更多