node.js - HTML FormData 文件未发布到 REST API
问题描述
我正在尝试将文件从前端 index.html 发布到在后台运行的 Express 服务器。然后应该 API 将文件保存到 Firebase 存储中。服务器运行正常,正在接收 POST,但 req.body 中没有数据。
index.html - 前端
<form method="POST" id="form">
<input type="file" id="file" name="file" multiple>
<input type="submit">
</form>
<script>
const form = document.querySelector('#form')
const postFile = (e) => {
e.preventDefault()
const header = { "Content-Type": "multipart/form-data" }
let formData = new FormData()
formData.append('file', this.file.files[0])
fetch('http://localhost:3003/file', {
method: form.method,
headers: header,
body: formData
}).then(() => {
alert("OK")
}).catch(() => {
alert("Nope")
})
}
form.addEventListener('submit', (e) => postFile(e))
</script>
server.js - 后端(不完整)
const server = express()
const routes = require('./routes')
server.use(cors())
server.use(express.urlencoded({
limit: '50mb',
extended: true
}))
server.use(express.json({
limit: '50mb',
extended: true
}))
server.use(routes)
server.listen(3003)
fileController.js - 后端(不完整)
exports.addFile = async (req, res) => {
try {
console.log(req.body)
return res.status(200).send({
message: "Ok"
})
} catch (e) {
return res.status(500).send({
message: e.message
})
}
当我在获取之前 console.log(this.file.files[0]) 时,它实际上返回了文件,但在服务器中只是一个空数组。 前端控制台.log ; 服务器控制台.log
解决方案
好的,问题解决了。正如 Wezelkrozum 指出的那样,我本可以使用 multer ( npm install --save multer
)
应用的更改:
索引.html
<form method="POST" id="form" **enctype="multipart/form-data"**>
<input type="file" id="file" name="file" multiple>
<input type="submit">
</form>
<script>
const form = document.querySelector('#form')
const postFile = (e) => {
e.preventDefault()
let formData = new FormData()
formData.append('file', this.file.files[0])
fetch('http://localhost:3003/file', { //Removed the Headers
method: form.method,
body: formData
}).then(() => {
alert("OK")
}).catch(() => {
alert("Nope")
})
}
form.addEventListener('submit', (e) => postFile(e))
</script>
路由.js
const express = require('express')
const multer = require('multer')
const routes = express.Router()
const upload = multer({dest: 'uploads/'}) //Folder where the temp file is stored
routes.post('/file', upload.single('file'), fileController.addFile) //This is for one file only
module.exports = routes
然后在 Controller 中,文件属性将以 req.file 的形式出现,就像:
let file = req.file
编辑:
要获取实际的文件内容,您必须使用:
npm install fs
fs.readFileSync(file.path)
它将返回文件的缓冲区,用于与File
或相关的任何操作Blob
推荐阅读
- sql - SQL Concat Rows if duplicate ID
- jquery - jquery - 鼠标悬停/鼠标离开 - 覆盖层闪烁
- reactjs - 反应选择多行标签
- sql-server - 列别名而不是技术名称
- python-2.7 - 获取父标签Selenium Python的元素
- reactjs - React Router v3 - IndexRoute 在 Google 缓存中不起作用
- gremlin - Gremlin 顺序模式和使用循环的边缘更新
- javascript - 页面切换脚本问题
- angular - Angular Material 6 datepicker 的关闭按钮可防止视图更新
- linux - qtCreator,找不到可执行文件