Node.js 无法将文件发送到express/multer后端

Node.js 无法将文件发送到express/multer后端,node.js,express,multer,Node.js,Express,Multer,下面的代码列出了文件夹中的文件。然后尝试将它们发送到express后端的post/upload。但是文件总是未定义的。然而,似乎大小和其他信息可以通过 客户端发送 const axios = require('axios'); var FormData = require('form-data'); //requiring path and fs modules const path = require('path'); const fs = require('fs'); //joining

下面的代码列出了文件夹中的文件。然后尝试将它们发送到express后端的post/upload。但是文件总是未定义的。然而,似乎大小和其他信息可以通过

客户端发送

const axios = require('axios');
var FormData = require('form-data');

//requiring path and fs modules
const path = require('path');
const fs = require('fs');
//joining path of directory 
const directoryPath = path.join(__dirname, '');
//passsing directoryPath and callback function
fs.readdir(directoryPath, function (err, files) {
    //handling error
    if (err) {
        return console.log('Unable to scan directory: ' + err);
    } 
    //listing all files using forEach
    var postInfo = files.forEach(async function (file) {

        const form_data = new FormData();
        form_data.append('file', fs.createReadStream(file));
        const request_config = {
            method: "post",
            url: 'http://localhost:8080/upload',
            port: 8080,
            headers: {
                "Content-Type": "multipart/form-data; boundary=form_data._boundary"
            },
            data: form_data
          };
        try {
            var req = await axios(request_config);
            // Do whatever you want to do with the file
            console.log("Request: ", req); 

        } catch (e) {
            console.error(e);
        }
    });
    console.log(postInfo);
});
在后端接收代码

const http = require('http')
const port = 8080
const express = require('express');
const app = express();
const multer = require('multer');
const server = http.createServer(app)

let storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, './uploads')
    },
    filename: function (req, file, cb) {
        cb(null, file.fieldname + '-' + Date.now())
    }
});

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


app.post('/upload', upload, (req, res) => {
    console.log(req.files) // this does log the uploaded image data.
})

// bind the server on port
server.listen(port, (err) => {
    if (err) {
        return console.log('something bad happened', err)
    }
    console.log(`server is listening on ${port}`)
})
日志:


我能够重现这个问题,并且能够用以下ajdusts修复代码(注意,为了简单起见,我上传了一个文件)

在客户端,您基本上只需将表单数据提供给axios并调用
getHeaders()
,即可获得已设置的标题-还需要调整表单中的
文件名

// client.js
...
const form_data = new FormData();
form_data.append('file', fs.createReadStream(__dirname + '/file-you-want-to-upload'));

const request_config = {
     method: "post",
     url: 'http://localhost:8080/upload',
     port: 8080,
     data: form_data,
     headers: form_data.getHeaders()
    }; 
...
在后端,您需要确保在使用
upload时访问
文件
而不是
文件
。single
并在处理程序中实际发送响应,否则响应将挂起:

//server.js
...
const upload = multer({storage}).single('file');
app.post('/upload', upload, (req, res) => {
    console.log(req.file) // this does log the uploaded image data.
    res.send("File uploaded");
});
...

我能够重现这个问题,并且能够用以下ajdusts修复代码(注意,为了简单起见,我上传了一个文件)

在客户端,您基本上只需将表单数据提供给axios并调用
getHeaders()
,即可获得已设置的标题-还需要调整表单中的
文件名

// client.js
...
const form_data = new FormData();
form_data.append('file', fs.createReadStream(__dirname + '/file-you-want-to-upload'));

const request_config = {
     method: "post",
     url: 'http://localhost:8080/upload',
     port: 8080,
     data: form_data,
     headers: form_data.getHeaders()
    }; 
...
在后端,您需要确保在使用
upload时访问
文件
而不是
文件
。single
并在处理程序中实际发送响应,否则响应将挂起:

//server.js
...
const upload = multer({storage}).single('file');
app.post('/upload', upload, (req, res) => {
    console.log(req.file) // this does log the uploaded image data.
    res.send("File uploaded");
});
...