node.js如何汇编文件上传?

时间:2016-12-06 18:51:14

标签: javascript node.js

我正在node.js中写一个图片上传,我已经从客户端上传了一个文件:

    <form id="frmImgUpload" 
          enctype="multipart/form-data"
          action="/uploads/"
          method="POST">
      <input id="btnFile"
             style="float:right;"
             type="file"/>
      <input id="btnUpload"
             style="float:right;"
             type="button"
             value="Upload"/>
    </form>

执行上传的代码:

    $("#btnUpload").click(function() {  
      $("#btnFile").attr("name", strCompanyKey);                    
      $("#frmImgUpload").submit();
    });

在服务器上我显示了数据(只是一个小片段):

    [ '------WebKitFormBoundaryI206ASCJdnqVyOo0\r\nContent-Disposition: form-data; name="syberdyne"; filename="simonplatten.png"\r\nContent-Type: image/png\r\n\r\n�PNG\r\n\u001a\n\u0000\u0000\u0000\rIHDR\u0000\u0000\u0000�\u0000\u0000\u0000l\b\u0006\u0000\u0000\u0000Ԃ\b�\u0000\u0000\u0000\tpHYs\u0000\u0000\u000b\u0013\u0000\u0000\u000b\u0013\u0001\u0000��\u0018\u0000\u0000\nOiCCPPhotoshop ICC profile\u0000\u0000xڝSgTS�\u0016=���BK���KoR\u0015\b RB��\u0014�',
    '*!\t\u0010J���\u0015Q�\u0011EE\u0004\u001bȠ�\u0003����\u0015Q,\f�\n�\u0007����������{�kּ������>������\u0007�\b\f�H3Q5�\f�B\u001e\u0011�������.@�\n$p\u0000\u0010\b�d!s�#\u0001\u0000�<<+"�\u0007�\u0000\u0001x�\u000b\b\u0000�M��0\u001c��\u000f�B�\\\u0001��\u0001�t�8K\b�\u0014\u0000@z�B�\u0000@F\u0001���',

我想要做的是将这些数据重新组合到原始文件中。它们是否是帮助我实现这一目标的任何API或教程?

我拆分了从客户端收到的内容:

    var strBody = "";
    request.on("data", function(chunk) {
      strBody += chunk;
    });
    request.on("end", function() {
      console.dir(strBody.split("\r\n"));
    });

这导致:

    [ '------WebKitFormBoundarynBkMCKI8RBvIReTF',
      'Content-Disposition: form-data; name="syberdyne";filename="simonplatten.png"','Content-Type: image/png','','�PNG','\u001a\n\u0000\u0000\u0000\rIHDR\u0000\u0000\u0000�\u0000\u0000\u0000l\b\u0006\u0000\u0000\u0000Ԃ\b�\u0000\u0000\u0000\tpHYs\u0000\u0000\u000b\u0013\u0000\u0000\u000b\u0013\u0001\u0000��\u0018\u0000\u0000\nOiCCPPhotoshop ICC profile\u0000\u0000xڝSgTS�\u0016=���BK���KoR\u0015\b RB��\u0014�&*!\t\u0010J���\u0015Q�\u0011EE\u0004\u001bȠ�\u0003����\u0015Q,\f�\n�\u0007����������{�kּ������>������\u0007�\b\f�H3Q5�\f�B\u001e\u0011�������.@�001\u0000O��y���7\u0000\u0000\u0000\u0000IEND�B`�',
      '------WebKitFormBoundarynBkMCKI8RBvIReTF--',
      '' ]

这只是一个数据片段,看起来二进制数据是以某种方式编码的,有没有我可以调用解码它的例程?

我已经安装了'强大',我该解析什么?

2 个答案:

答案 0 :(得分:3)

您可以使用multer包:https://www.npmjs.com/package/multer

Multer将一个body对象和一个或一个文件或文件对象添加到请求对象中。 body对象包含表单文本字段的值,文件或files对象包含通过表单上传的文件。

示例

var express = require('express')
var multer  = require('multer')
var upload = multer({ dest: 'uploads/' })

var app = express()

app.post('/profile', upload.single('avatar'), function (req, res, next) {
  // req.file is the `avatar` file 
  // req.body will hold the text fields, if there were any 
})

答案 1 :(得分:0)

Formidable是一个用于解析表单数据的node.js模块,特别是文件上传。&#34;

根据其documentation,您可以传递请求,并允许您通过回调函数或事件方便地访问表单数据。

通过可选回调:

var form = new formidable.IncomingForm();

form.parse(req, function(err, fields, files) {
  // ...
});

通过活动:

var form = new formidable.IncomingForm();

form.on('error', function(err) {
  // ...
});

form.on('field', function(name, value) {
  // ...
});

form.on('file', function(name, file) {
  // ...
});

form.parse(req);