我尝试创建一个服务器,什么可以从HTTP请求接收文件。 我使用Postman作为用户代理,我在请求中添加了一个文件。这是请求:
POST /getfile HTTP/1.1
Host: localhost:3000
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Cache-Control: no-cache
Postman-Token: 9476dbcc-988d-c9bd-0f49-b5a3ceb95b85
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="test.xls"
Content-Type: application/vnd.ms-excel
------WebKitFormBoundary7MA4YWxkTrZu0gW--
但是当请求到达服务器时,我找不到它中的文件(我的意思是在请求中)。
我试图从请求的正文部分接收它,但它返回> {}
<。{我试图找出,我怎么能引用文件的名称,但遗憾的是我在请求标题中找不到文件名的任何引用...
任何人都可以帮我找出,我该怎么办?
答案 0 :(得分:2)
您需要解析请求中的表单数据。有一些软件包可以解决此问题,尤其是formidable
,busboy
(或busboy-connect
),parted
和flow
。
以下是使用formidable的解决方案,它是图像上传之类的首选解决方案,因为它可以保存到磁盘。 如果您只想阅读该文件,可以使用上述其他软件包之一。
安装强大的
npm install formidable --save
然后,在您的服务器中,您将不得不解析来自客户端的数据:
// Somewhere at the start of your file
var IncomingForm = require('formidable').IncomingForm
// ...
// Then in your request handler
var form = new IncomingForm()
form.uploadDir = 'uploads'
form.parse(request, function(err, fields, files) {
if (err) {
console.log('some error', err)
} else if (!files.file) {
console.log('no file received')
} else {
var file = files.file
console.log('saved file to', file.path)
console.log('original name', file.name)
console.log('type', file.type)
console.log('size', file.size)
}
})
有几点需要注意:
fs
重命名或移动它们form.keepExtensions = true
答案 1 :(得分:2)
作为我评论的后续内容,您可以使用multer模块实现您想要的东西: https://www.npmjs.com/package/multer
const express = require('express');
const multer = require('multer');
const app = express();
const upload = multer();
app.post('/profile', upload.array(), function (req, res, next) {
// req.body contains the text fields
});
答案 2 :(得分:1)
var app = require('express')();
var multer = require('multer');
var upload = multer();
app.post('/your_path', upload.array(), function (req, res, next) {
// req.files is array of uploaded files
// req.body will contain the text fields, if there were any
});