自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Nodejs進階:基于express+multer的文件上傳

開發(fā) 前端
圖片上傳是web開發(fā)中經常用到的功能,node社區(qū)在這方面也有了相對完善的支持。常用的開源組件有multer、formidable等,借助這兩個開源組件,可以輕松搞定圖片上傳。本文主要講解以下內容,后續(xù)章節(jié)會對技術實現細節(jié)進行深入挖掘。

概覽

圖片上傳是web開發(fā)中經常用到的功能,node社區(qū)在這方面也有了相對完善的支持。

常用的開源組件有multer、formidable等,借助這兩個開源組件,可以輕松搞定圖片上傳。

本文主要講解以下內容,后續(xù)章節(jié)會對技術實現細節(jié)進行深入挖掘。

  • 基礎例子:借助express、multer實現單圖、多圖上傳。
  • 常用API:獲取上傳的圖片的信息。
  • 進階使用:自定義保存的圖片路徑、名稱。

關于作者

程序猿小卡,前騰訊IMWEB團隊成員,阿里云棲社區(qū)專家認證博主。歡迎加入 Express前端交流群(197339705)。

正在填坑:《Nodejs學習筆記》 / 《Express學習筆記》

社區(qū)鏈接:云棲社區(qū) / github / 新浪微博 / 知乎 / Segmentfault / 博客園 / 站酷

環(huán)境初始化

非常簡單,一行命令。

  1. npm install express multer multer --save 

每個示例下面,都有下面兩個文件

  1. ➜  upload-custom-filename git:(master) ✗ tree -L 1 
  2. ├── app.js # 服務端代碼,用來處理文件上傳請求 
  3. ├── form.html # 前端頁面,用來上傳文件  

基礎例子:單圖上傳

app.js。

  1. var fs = require('fs'); 
  2. var express = require('express'); 
  3. var multer  = require('multer'
  4.  
  5. var app = express(); 
  6. var upload = multer({ dest: 'upload/' }); 
  7.  
  8. // 單圖上傳 
  9. app.post('/upload', upload.single('logo'), function(req, res, next){ 
  10.     res.send({ret_code: '0'}); 
  11. }); 
  12.  
  13. app.get('/form'function(req, res, next){ 
  14.     var form = fs.readFileSync('./form.html', {encoding: 'utf8'}); 
  15.     res.send(form); 
  16. }); 
  17.  
  18. app.listen(3000);  

form.html。

  1. <form action="/upload-single" method="post" enctype="multipart/form-data"
  2.     <h2>單圖上傳</h2> 
  3.     <input type="file" name="logo"
  4.     <input type="submit" value="提交"
  5. </form>  

運行服務。

  1. node app.js 

訪問 http://127.0.0.1:3000/form ,選擇圖片,點擊“提交”,done。然后,你就會看到 upload 目錄下多了個圖片。

基礎例子:多圖上傳

代碼簡直不能更簡單,將前面的 upload.single('logo') 改成 upload.array('logo', 2) 就行。表示:同時支持2張圖片上傳,并且 name 屬性為 logo。

app.js。

  1. var fs = require('fs'); 
  2. var express = require('express'); 
  3. var multer  = require('multer'
  4.  
  5. var app = express(); 
  6. var upload = multer({ dest: 'upload/' }); 
  7.  
  8. // 多圖上傳 
  9. app.post('/upload', upload.array('logo', 2), function(req, res, next){ 
  10.     res.send({ret_code: '0'}); 
  11. }); 
  12.  
  13. app.get('/form'function(req, res, next){ 
  14.     var form = fs.readFileSync('./form.html', {encoding: 'utf8'}); 
  15.     res.send(form); 
  16. }); 
  17.  
  18. app.listen(3000);  

form.html。

  1. <form action="/upload-multi" method="post" enctype="multipart/form-data"
  2.     <h2>多圖上傳</h2> 
  3.     <input type="file" name="logos"
  4.     <input type="file" name="logos"
  5.     <input type="submit" value="提交"
  6. </form>  

同樣的測試步驟,不贅述。

獲取上傳的圖片的信息

很多時候,除了將圖片保存在服務器外,我們還需要做很多其他事情,比如將圖片的信息存到數據庫里。

常用的信息比如原始文件名、文件類型、文件大小、本地保存路徑等。借助multer,我們可以很方便的獲取這些信息。

還是單文件上傳的例子,此時,multer會將文件的信息寫到 req.file 上,如下代碼所示。

app.js。

  1. var fs = require('fs'); 
  2. var express = require('express'); 
  3. var multer  = require('multer'
  4.  
  5. var app = express(); 
  6. var upload = multer({ dest: 'upload/' }); 
  7.  
  8. // 單圖上傳 
  9. app.post('/upload', upload.single('logo'), function(req, res, next){ 
  10.     var file = req.file; 
  11.  
  12.     console.log('文件類型:%s', file.mimetype); 
  13.     console.log('原始文件名:%s', file.originalname); 
  14.     console.log('文件大小:%s', file.size); 
  15.     console.log('文件保存路徑:%s', file.path); 
  16.  
  17.     res.send({ret_code: '0'}); 
  18. }); 
  19.  
  20. app.get('/form'function(req, res, next){ 
  21.     var form = fs.readFileSync('./form.html', {encoding: 'utf8'}); 
  22.     res.send(form); 
  23. }); 
  24.  
  25. app.listen(3000);  

form.html。

  1. <form action="/upload" method="post" enctype="multipart/form-data"> 
  2.     <h2>單圖上傳</h2> 
  3.     <input type="file" name="logo"> 
  4.     <input type="submit" value="提交"> 
  5. </form>  

啟動服務,上傳文件后,就會看到控制臺下打印出的信息。

  1. 文件類型:image/png 
  2. 原始文件名:1.png 
  3. 文件大?。?8379 
  4. 文件保存路徑:upload/b7e4bb22375695d92689e45b551873d9  

自定義文件上傳路徑、名稱

有的時候,我們想要定制文件上傳的路徑、名稱,multer也可以方便的實現。

自定義本地保存的路徑

非常簡單,比如我們想將文件上傳到 my-upload 目錄下,修改下 dest 配置項就行。

  1. var upload = multer({ dest: 'upload/' }); 

在上面的配置下,所有資源都是保存在同個目錄下。有時我們需要針對不同文件進行個性化設置,那么,可以參考下一小節(jié)的內容。

自定義本地保存的文件名

代碼稍微長一點,單同樣簡單。multer 提供了 storage 這個參數來對資源保存的路徑、文件名進行個性化設置。

使用注意事項如下:

  • destination:設置資源的保存路徑。注意,如果沒有這個配置項,默認會保存在 /tmp/uploads 下。此外,路徑需要自己創(chuàng)建。
  • filename:設置資源保存在本地的文件名。

app.js。

  1. var fs = require('fs'); 
  2. var express = require('express'); 
  3. var multer  = require('multer'
  4.  
  5. var app = express(); 
  6.  
  7. var createFolder = function(folder){ 
  8.     try{ 
  9.         fs.accessSync(folder);  
  10.     }catch(e){ 
  11.         fs.mkdirSync(folder); 
  12.     }   
  13. }; 
  14.  
  15. var uploadFolder = './upload/'
  16.  
  17. createFolder(uploadFolder); 
  18.  
  19. // 通過 filename 屬性定制 
  20. var storage = multer.diskStorage({ 
  21.     destination: function (req, file, cb) { 
  22.         cb(null, uploadFolder);    // 保存的路徑,備注:需要自己創(chuàng)建 
  23.     }, 
  24.     filename: function (req, file, cb) { 
  25.         // 將保存文件名設置為 字段名 + 時間戳,比如 logo-1478521468943 
  26.         cb(null, file.fieldname + '-' + Date.now());   
  27.     } 
  28. }); 
  29.  
  30. // 通過 storage 選項來對 上傳行為 進行定制化 
  31. var upload = multer({ storage: storage }) 
  32.  
  33. // 單圖上傳 
  34. app.post('/upload', upload.single('logo'), function(req, res, next){ 
  35.     var file = req.file; 
  36.     res.send({ret_code: '0'}); 
  37. }); 
  38.  
  39. app.get('/form'function(req, res, next){ 
  40.     var form = fs.readFileSync('./form.html', {encoding: 'utf8'}); 
  41.     res.send(form); 
  42. }); 
  43.  
  44. app.listen(3000);  

form.html。

  1. <form action="/upload" method="post" enctype="multipart/form-data"
  2.     <h2>單圖上傳</h2> 
  3.     <input type="file" name="logo"
  4.     <input type="submit" value="提交"
  5. </form>  

測試步驟不贅述,訪問一下就知道效果了。

寫在后面

本文對multer的基礎用法進行了介紹,并未涉及過多原理性的東西。俗話說 授人以漁不如授人以漁,在后續(xù)的章節(jié)里,會對文件上傳的細節(jié)進行挖掘,好讓讀者朋友對文件上傳加深進一步的認識。

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2014-04-18 10:04:15

NodeJS前后端分離

2017-03-02 11:58:31

NodeJS服務器

2014-07-29 10:35:21

DockerNodeJS

2021-09-29 08:08:13

前端技術編程

2021-03-04 08:33:20

JavaScript 前端原生js

2020-10-20 11:12:11

Nodejs

2012-04-16 09:19:03

jQuery插件

2024-02-26 00:00:00

NodeExpressjsNodejs

2011-10-18 10:17:13

Node.js

2022-08-12 22:53:32

HadoopHDFS分布式

2021-09-26 05:05:46

GoFiber Express

2018-05-09 14:45:50

蘇寧前端Nodejs

2021-08-30 19:04:29

jsIO

2016-12-15 08:28:34

HttpURLConn上傳文件

2024-02-02 09:14:55

TCP協(xié)議Socket編程WPF

2022-06-13 15:59:13

Node.jsNodeJs

2009-07-06 17:11:38

Servlet文件上傳

2014-09-02 14:18:27

NodeJsLivePool

2009-08-13 15:18:23

C#文件上傳

2009-11-24 15:01:59

PHP通用文件上傳類
點贊
收藏

51CTO技術棧公眾號