2016-12-06 97 views
0

我寫在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�������[email protected]�\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\[email protected]�B�\[email protected]\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�������[email protected]�001\u0000O��y���7\u0000\u0000\u0000\u0000IEND�B`�', 
     '------WebKitFormBoundarynBkMCKI8RBvIReTF--', 
     '' ] 

這僅僅是一個數據的片段,它看起來像二進制數據進行編碼不知何故,我能打電話解碼它嗎?

我安裝了'可怕的',我該怎麼解析它?

+0

https://coligo.io/building-ajax-file-uploader-with-node/ – Ouroborus

+0

@Ouroborus,我已經下載了強大的,我怎麼解析它,我沒有使用快遞。 – SPlatten

+1

Formidable確實有[文檔](https://github.com/felixge/node-formidable/blob/master/Readme.md)。看起來你傳遞了請求對象和回調函數。回調和一些事件可以讓你對錶單數據做一些事情。 'field'和'file'事件可能是你感興趣的。 – Ouroborus

回答

0

Formidable是 「用於解析形式數據,特別是文件上傳一個的node.js模塊」。

根據其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); 
+0

謝謝,效果很好,除了上傳的文件名不是我設置的,它像'upload_30f582d3347732dd2629b99e91a14b72'這樣的東西現在正在調查。 – SPlatten

+0

@SPlatten您可以訪問客戶端提供的文件名作爲文件對象的'name'屬性,例如:'file.name'。 – Ouroborus

+0

我已更正文件名,但文件類型仍然是錯誤的。 – SPlatten

3

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

Multer增加了身體的對象和一個或多個文件反對這項請求的對象。主體對象包含表單文本字段的值,文件或文件對象包含通過表單上傳的文件。

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 
}) 
+0

看起來您會使用'multter'從服務器發佈到自身,這如何幫助解碼接收到的數據? – SPlatten

+0

您將在您的服務器上保存文件 - 例如在'uploads'目錄下,你可以使用fs從那裏讀取它。readFile –

+0

這不是我想要的,我希望客戶端能夠選擇一個文件並將其上傳到服務器,然後服務器將其保存到本地文件系統。 – SPlatten