nodejs檔案上傳處理模組formidable
本文轉自http://itbilu.com/nodejs/npm/NkGKcF14.html
在web開發中,經常遇到處理檔案上傳的情況。而express框架在4.0版本後就不在支援req.files接收上傳檔案,對於檔案上傳,需要加multipart格式資料處理的中介軟體。multipart資料處理中介軟體有:busboy, multer, formidable, multiparty, connect-multiparty, pez等。本站使用了formidable外掛,比較簡單易用。
formidable是一個用於處理檔案、圖片、視訊等資料上傳的模組,支援GB級上傳資料處理,支援多種客戶端資料提交。有極高的測試覆蓋率,非常適合在生產環境中使用。
安裝
formidable是一個輕量級的應用包,可以不依賴於express等框架單獨使用,也可以整合到exress框架中使用。安裝命令如下:
- npm install formidable@latest
使用
在nodejs原生環境中使用formidable。
- var formidable = require('formidable'),
- http = require('http'),
- util = require('util');
- //用http模組建立一個http服務端
- http.createServer(function(req, res) {
- if (req.url == '/upload' && req.method.toLowerCase() === 'post') {
- // 處理上傳的檔案
- var form = new formidable.IncomingForm();
- form.parse(req, function(err, fields, files) {
- res.writeHead(200, {'content-type': 'text/plain'});
- res.write('received upload:\n\n');
- res.end(util.inspect({fields: fields, files: files}));
- });
- return;
- }
上傳後,響應結果如下
- received upload:
- { fields: { title: 'title的內容' },
- files: //所有type="file"型別的資料物件
- { upload:
- { domain: null,
- _events: {},
- _maxListeners: 10,
- size: 41966, //檔案大小
- path: '/var/folders/1k/86kq55_n4_q2tckwz9mb5wyr0000gn/T/upload_ecbf965abc1e14c2ffc86875c2f5eaa8', //檔案儲存路徑
- name: 'avatar.jpg', //上傳前的檔名
- type: 'image/jpeg', //檔案型別
- hash: null,
- lastModifiedDate: Sat May 16 2015 10:38:57 GMT+0800 (CST),
- _writeStream: [Object] } } }
常用API
建立一個incoming form例項- var form = new formidable.IncomingForm()
設定incoming form fields(fileds指除type="file"外的其它接收資料)編碼
- form.encoding = 'utf-8';
設定檔案接收後儲存的資料夾。此資料夾一般為上傳後的臨時資料夾,上傳後呼叫 fs.rename()對檔案進行移動及重新命名。預設儲存路徑為os.tmpDir()
- form.uploadDir = "/my/dir";
- form.keepExtensions = false;
'multipart'或'urlencoded'型別的請求在formidable都支援,可通過上傳檔案的type屬性檢視檔案型別
- form.type
- form.maxFieldsSize = 2 * 1024 * 1024;
- form.maxFields = 1000;
- form.hash = false;
在express中使用formidable
在express框架中使用formidable,需要一個接收檔案提交的路由。以下示例為一個接收使用者頭像提交的路由- router.post("/user/avatar", user.avatar);
路由對應的接收提交資料的方法
- //設定頭像
- exports.avatar = function(req, res, next) {
- var form = new formidable.IncomingForm();
- form.uploadDir = path.join(__dirname, 'tmp'); //檔案儲存的臨時目錄為當前專案下的tmp資料夾
- form.maxFieldsSize = 1 * 1024 * 1024; //使用者頭像大小限制為最大1M
- form.keepExtensions = true; //使用檔案的原副檔名
- form.parse(req, function (err, fields, file) {
- var filePath = '';
- //如果提交檔案的form中將上傳檔案的input名設定為tmpFile,就從tmpFile中取上傳檔案。否則取for in迴圈第一個上傳的檔案。
- if(file.tmpFile){
- filePath = file.tmpFile.path;
- } else {
- for(var key in file){
- if( file[key].path && filePath==='' ){
- filePath = file[key].path;
- break;
- }
- }
- }
- //檔案移動的目錄資料夾,不存在時建立目標資料夾
- var targetDir = path.join(__dirname, 'upload');
- if (!fs.existsSync(targetDir)) {
- fs.mkdir(targetDir);
- }
- var fileExt = filePath.substring(filePath.lastIndexOf('.'));
- //判斷檔案型別是否允許上傳
- if (('.jpg.jpeg.png.gif').indexOf(fileExt.toLowerCase()) === -1) {
- var err = new Error('此檔案型別不允許上傳');
- res.json({code:-1, message:'此檔案型別不允許上傳'});
- } else {
- //以當前時間戳對上傳檔案進行重新命名
- var fileName = new Date().getTime() + fileExt;
- var targetFile = path.join(targetDir, fileName);
- //移動檔案
- fs.rename(filePath, targetFile, function (err) {
- if (err) {
- console.info(err);
- res.json({code:-1, message:'操作失敗'});
- } else {
- //上傳成功,返回檔案的相對路徑
- var fileUrl = '/upload/' + fileName;
- res.json({code:0, fileUrl:fileUrl});
- }
- });
- }
- });
- }
相關文章
- NodeJS+formidable實現檔案上傳加自動重新命名NodeJSORM
- laravel處理檔案上傳Laravel
- Nodejs檔案上傳NodeJS
- .NET Core 如何上傳檔案及處理大檔案上傳
- php上傳大檔案失敗處理PHP
- nodeJs + js 大檔案分片上傳NodeJS
- Nodejs教程16:POST檔案上傳NodeJS
- js+nodejs完成檔案上傳NodeJS
- 處理檔案上傳的工具包 - fuh
- Alan`s blog — 檔案上傳模組
- git上傳檔案時報錯常見的處理辦法Git
- nodejs 使用七牛雲端儲存上傳檔案NodeJS
- php檔案上傳之多檔案上傳PHP
- 處理檔案上傳時的訊息格式轉換問題
- uploadify前臺上傳檔案,java後臺處理的例子Java
- ASP.NET:MVC中檔案上傳與地址變化處理ASP.NETMVC
- JAX-WS - 二進位制處理之MTOM(檔案上傳)
- 單個檔案上傳和批量檔案上傳
- 使用nodejs+express完成簡單的檔案上傳功能NodeJSExpress
- 使用 NodeJS 將檔案或影像上傳到伺服器NodeJS伺服器
- nodejs+express(4.x+)實現檔案上傳功能NodeJSExpress
- 檔案上傳
- avro處理hadoop上的小檔案VRHadoop
- SpringMVC 單檔案上傳與多檔案上傳SpringMVC
- 【SpringMVC】檔案上傳與下載、攔截器、異常處理器SpringMVC
- java Socket Tcp示例三則(服務端處理資料、上傳檔案)JavaTCP服務端
- spring+hibernate檔案上傳並放入大欄位的處理Spring
- Java大檔案上傳、分片上傳、多檔案上傳、斷點續傳、上傳檔案minio、分片上傳minio等解決方案Java斷點
- 檔案上傳之三基於flash的檔案上傳
- 前端大檔案上傳/分片上傳前端
- .Net上傳檔案處理三大正規化,及開發注意事項
- Flask——檔案上傳Flask
- PHP上傳檔案PHP
- JavaScript 檔案上傳JavaScript
- Git上傳檔案Git
- YII檔案上傳
- 檔案上傳概述
- beego上傳檔案Go