节点js在HTTP请求中接收文件

时间:2017-10-27 10:10:02

标签: javascript node.js http

我尝试创建一个服务器,什么可以从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--

但是当请求到达服务器时,我找不到它中的文件(我的意思是在请求中)。 我试图从请求的正文部分接收它,但它返回> {}<。{我试图找出,我怎么能引用文件的名称,但遗憾的是我在请求标题中找不到文件名的任何引用...

任何人都可以帮我找出,我该怎么办?

3 个答案:

答案 0 :(得分:2)

您需要解析请求中的表单数据。有一些软件包可以解决此问题,尤其是formidablebusboy(或busboy-connect),partedflow

以下是使用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)

  }
})

有几点需要注意:

  • formidable使用新名称保存文件,您可以使用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
});