Node.js 通过Multer、Node和Express根据POST请求将文件上载到后端服务器

Node.js 通过Multer、Node和Express根据POST请求将文件上载到后端服务器,node.js,angular,express,multipartform-data,multer,Node.js,Angular,Express,Multipartform Data,Multer,我正试图通过POST请求从本地系统向后端服务器发送一个from,但每次都使用--二进制数据而不是--表单时,我都无法这样做 下面是我想使用Node.js构建的示例curl: curl --location --request POST 'some-endpoint' \ --form 'file=@"/Users/name/Desktop/sample.csv"' 以下是component.html: <form (ngSubmit)="handleCsvC

我正试图通过POST请求从本地系统向后端服务器发送一个from,但每次都使用--二进制数据而不是--表单时,我都无法这样做

下面是我想使用Node.js构建的示例curl:

curl --location --request POST 'some-endpoint' \
--form 'file=@"/Users/name/Desktop/sample.csv"'
以下是component.html:

<form (ngSubmit)="handleCsvClick()" encrypt="multipart/form-data">
 <input
  type="file"
  name="file-input"
  #fileInput
  [disabled]="requestInProgess"
  (change)="handleFilePick()"
/>
<button
class="upload-btn btn-reset"
type="submit"
>
Upload CSV File
</button>
</form>
Node.js

路由器文件:

const path = require('path');
const express = require("express");
const cookieParser = require("cookie-parser");
const multer = require('multer');
const router = express.Router();
const uuidv4 = require('uuid/v4');
const advisoryController = require("../controllers/advisoryController");
const { UPLOADS_PATH } = require('../config/environment');
const storage = multer.diskStorage({
  destination: UPLOADS_PATH,
  filename: function(_, file, cb) {
    const fileExt = path.extname(file.originalname);
    cb(null, `_csvUploadFile_${uuidv4()}${fileExt}`);
  },
});
const upload = multer({ storage });

router.post("/upload-csv", upload.single("file"), (req, res) => {
  advisoryController
    .uploadCSV(req.file)
    .then(response => res.send(response.data))
    .catch(error => {
      res.status(error.status || 500).send("Something went wrong");
      console.log(error);
    });
});
控制器:

const axios = require("axios");
const { advisoryList } = require("../config/apiConfig");
const fs = require('fs');
const request = require('request');
const FormData = require('form-data');

function uploadCSV(file) {
  let requestUrl = advisoryList.uploadCSV.url;
  const { path } = file;
  const fileUpload = fs.createReadStream(path);
  return new Promise((resolve, reject) => {
    axios
    .post(requestUrl, fileUpload, {headers: {
      'Content-Type': 'multipart/form-data'
    }})
    .then(response => {
      resolve(response.data);
    })
    .catch(error => {
      reject(error)
      console.log("CURL: ", error.request.toCurl());
    });
  })
}
在所有这些之后构建的curl是--data binary而不是--form:

而不是:

curl --location --request POST 'some-endpoint' \
--form 'file=@"/Users/name/Desktop/sample.csv"'

任何帮助都将不胜感激。提前感谢。

要使用Node.js中的axios发送文件,您需要:

  • 使用
    表单数据
    库创建表单
  • 使用
    getHeaders()
  • 将代码更改为:

    const form=new FormData();
    append('file',fileUpload,path);//第三个参数是文件名
    //随文件一起发送其他字段
    表格。附加(“标题”,“2021年第1季度”);
    append(‘描述’,‘一份非常有趣的报告’);
    //获取要传递到axios的表单头
    const formHeaders=form.getHeaders();
    //使用axios发送文件
    post(requestUrl,form,{headers:{…formHeaders}});
    

    你的问题启发我把这个答案写成一篇文章-。它涵盖了一些常见的陷阱,您将学习如何发送存储为缓冲区或来自流的文件。

    您是一位救世主,非常感谢。最后一个问题,如果我想随文件一起发送多个字段,理想的方法是什么?不客气!我编辑了答案,向您展示了如何发送其他字段。@Vish您的问题启发我写了一篇关于-。它涵盖了一些常见的陷阱,并将文件作为缓冲区或流发送。谢谢你的灵感!很好的工作,谢谢你对社区的贡献。总有一天它会帮助别人的。
    curl 'someendpoint' -H 'accept: application/json, text/plain, */*' -H 'content-type: multipart/form-data' -H 'user-agent: axios/0.18.0' --data-binary $'userId,name,age,city\n29298914,vish,30,Bangalore\r\n0\r\n\r\n' --compressed
    
    curl --location --request POST 'some-endpoint' \
    --form 'file=@"/Users/name/Desktop/sample.csv"'