Node.js 通过Multer、Node和Express根据POST请求将文件上载到后端服务器
我正试图通过POST请求从本地系统向后端服务器发送一个from,但每次都使用--二进制数据而不是--表单时,我都无法这样做 下面是我想使用Node.js构建的示例curl: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
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"'