如何在 node.js 中处理 multipart/form-data

Posted

技术标签:

【中文标题】如何在 node.js 中处理 multipart/form-data【英文标题】:how to handle multipart/form-data in node.js 【发布时间】:2012-10-21 20:57:37 【问题描述】:

我正在使用多部分表单数据从客户端上传图像文件。我想使用 node.js 在服务器端接收并将其作为文件写入。

<html>
    <body>
        <form action="url" method="post" enctype="multipart/form-data">
            <input type="text" name="imageName">
            <input type="file" name="sam">
        </form>
    </body>
</html>

这是我的客户端代码。如何在服务器端处理这个文件。

【问题讨论】:

【参考方案1】:

链接下面是重复的问题。

Uploading images using Node.js, Express, and Mongoose

示例如下:

// Expose modules in ./support for demo purposes
require.paths.unshift(__dirname + '/../../support');

/**
 * Module dependencies.
 */

var express = require('../../lib/express')
  , form = require('connect-form');

var app = express.createServer(
  // connect-form (http://github.com/visionmedia/connect-form)
  // middleware uses the formidable middleware to parse urlencoded
  // and multipart form data
  form( keepExtensions: true )
);

app.get('/', function(req, res)
  res.send('<form method="post" enctype="multipart/form-data">'
    + '<p>Image: <input type="file" name="image" /></p>'
    + '<p><input type="submit" value="Upload" /></p>'
    + '</form>');
);

app.post('/', function(req, res, next)

  // connect-form adds the req.form object
  // we can (optionally) define onComplete, passing
  // the exception (if any) fields parsed, and files parsed
  req.form.complete(function(err, fields, files)
    if (err) 
      next(err);
     else 
      console.log('\nuploaded %s to %s'
        ,  files.image.filename
        , files.image.path);
      res.redirect('back');
    
  );

  // We can add listeners for several form
  // events such as "progress"
  req.form.on('progress', function(bytesReceived, bytesExpected)
    var percent = (bytesReceived / bytesExpected * 100) | 0;
    process.stdout.write('Uploading: %' + percent + '\r');
  );
);

app.listen(3000);
console.log('Express app started on port 3000');

如果您的问题没有解决,请访问 this link 。这是一篇关于文件上传的好文章。

【讨论】:

【参考方案2】:

您可以使用请求模块来发送多部分请求。下面是示例代码:

var jsonUpload =   ;
var formData = 
    'file': fs.createReadStream(fileName),
    'jsonUpload': JSON.stringify(jsonUpload)
;
var uploadOptions = 
    "url": "https://upload/url",
    "method": "POST",
    "headers": 
        "Authorization": "Bearer " + accessToken
    ,
    "formData": formData

var req = request(uploadOptions, function(err, resp, body) 
    if (err) 
        console.log('Error ', err);
     else 
        console.log('upload successful', body)
    
);

【讨论】:

他想处理数据,而不是发送数据。

以上是关于如何在 node.js 中处理 multipart/form-data的主要内容,如果未能解决你的问题,请参考以下文章

仅使用 vanilla node.js 将 multipart/form-data 与文件组合

尝试使用 node.js supertest 发布 multipart/form-data

如何在 formData 对象中附加文件而不在 Node.js 中物理保存文件?

如何在 node.js 中处理 POST 请求

如何使用socket.io发送multipart / form-data?

如何在 Node.js expressjs 的异步对象方法中处理未处理的承诺拒绝?