如何将对象数组中的文件发送到快递服务器?

Wae*_*eez 0 javascript rest node.js express reactjs

我有一个对象数组,每个对象都包含一些字符串类型的属性和一个文件。

这是我的数组的样子:

const args = [
    {
        name: 'presentation',
        price: 9.99,
        tags: 'invest, finance, business',
        file: File,
        thumbnail: File
    },
    {
        name: 'presentation2',
        price: 20.99,
        tags: 'invest, finance, business',
        file: File,
        thumbnail: File
    }
]

const headers = {
 headers: {
   Authorization: `Bearer ${token}`
 }
};
Run Code Online (Sandbox Code Playgroud)

我的目标是将整个对象数组发送到 Express Server。在那里我会将信息保存到 Mongo 并将文件上传到 S3。但是目前,当我在 POST 请求中发送此文件时,我无法在服务器上获取文件流,甚至req.body当我 console.log 时整个都是空对象

axios.post(`${slidesRoute}/createSlides`, args, headers);
Run Code Online (Sandbox Code Playgroud)

或者,我尝试将所有内容都放入 FormData 中。 例如:

let formData = new FormData();
    selectedFiles.forEach((selectedFile, i) => {
        formData.append(`name_${i}`, selectedFile.name);
        formData.append(`price_${i}`, selectedFile.price);
        formData.append(`tags_${i}`, selectedFile.tags);
        formData.append(`file_${i}`, selectedFile.file);
        formData.append(`thumbnail_${i}`, selectedFile.thumbnail);
    });
axios.post(`${slidesRoute}/createSlides`, formData, headers);
Run Code Online (Sandbox Code Playgroud)

然后在后台。我无法使用 multer 捕获这些文件。因为表单数据中的文件名是动态生成的

file_1, file_2 file_3,...
Run Code Online (Sandbox Code Playgroud)

但是 multer 期望传递确切的文件名,例如 multer().array('file')

所以在我的第二种方法中,我无法使用 Multer 捕获文件

Max*_*Max 5

您不能在 JSON 中包含文件。文件不可 JSON 序列化。理想情况下,您应该有一个单独的端点来接受您的文件,使用 发送它们content-type: multipart/form-data,接收存储在服务器上的该文件的唯一 ID,然后使用 ID 而不是文件发送您的 JSON。

作为替代方案,您可以将您的文件 Base64 编码为一个字符串,在您的请求中插入这个字符串,然后在接收端将其解码回来