Multer 文件上傳中間件 和 Busboy表單解析

Multer

是一個node.js中間件,用于處理 multipart/form-data類型的表單數據,主要用于上傳文件。處理 multipart/form-data 類型的表單數據

Multer是基于Busboy解析的文件參數信息,獲取fileStream,并通過storage轉存的file.stream.pipe(outStream) //file.stream即fileStream

Multer在解析完請求體后,會向Request對象中添加一個body對象和一個file或files對象(上傳多個文件時使用files對象 )。其中,body對象中包含所提交表單中的文本字段(如果有),而file(或files)對象中包含通過表單上傳的文件

multer(options).single(name)

上傳單個文件內容,如一次只上傳一張圖片。name為上傳文件時的參數字段名稱。

multer(options).array(name[,maxCount])

適用于同一個字段,一次上傳多個文件的情況,例如選擇多張圖片發送。接受一個以 name?命名的文件數組。可以指定 maxCount 來限制上傳的最大數量。這些文件的信息保存在 req.files。

multer(options).fields(fields)

適用于上傳多個字段的情況。接受指定 fields 的混合文件。這些文件的信息保存在 req.files。fields 是一個對象數組,具有 name 和可選的 maxCount 屬性

multer(options).none()

接收只有文本域的表單,如果上傳任何文件,會返回 “LIMIT_UNEXPECTED_FILE” 錯誤。

multer(options).any()

接收一切上傳的文件。

Multer 接受一個 options 對象,其中最基本的是 dest/storage?屬性,這將告訴 Multer 將上傳文件保存在哪。如果省略 options 對象,這些文件將保存在內存中,永遠不會寫入磁盤。

1.dest:指定上傳文件的存儲路徑。文件名默認為隨機字符。如果想自定義文件名稱,使用storage屬性代替dest

2.storage:指定上傳文件的存儲路徑和文件名稱。

2-1.DiskStorage 磁盤存儲引擎

磁盤存儲引擎可以讓你控制文件的存儲。有兩個屬性,屬性值都是函數。destination,指定文件存儲的路徑;filename,指定文件的存儲名稱。

multer({storage: multer.diskStorage({

????????//設置存儲路徑

????????destination:(req,file,cb)=>{

????????????console.log("destination:",file);//打印結果如下圖

????????????cb(null,fullPath);

????????},

????????//設置存儲的文件名

????????filename:(req,file,cb)=>{

????????????console.log("filename:",file);//打印結果如下圖

????????????//獲取文件的擴展名

????????????let extname=path.extname(file.originalname);

????????????filename=file.fieldname+"-"+Date.now()+extname;

????????????cb(null,filename);

????????}

????})

});

2-2.MemoryStorage 內存存儲引擎

multer({storage: multer.memoryStorage()})

3.limits: 用來指定一些數據大小的限制等

????????limits:{

???????? files:2, //最多上傳2個文件

????????????fileSize:5120 //設置單個文件最大為 5kb

????????}

4.fileFilter

fileFilter 為一個函數,用來控制什么文件可以上傳以及什么文件應該跳過。

function fileFilter (req, file, cb) {

??// 通過調用cb,用boolean值來指示是否應接受該文件

??// 拒絕這個文件,使用`false`,像這樣:

??cb(null, false)

??// 接受這個文件,使用`true`,像這樣:

??cb(null, true)

??// 如果有問題,你可以總是這樣發送一個錯誤:

??cb(new Error('I don\'t have a clue!'))

}

Busboy

用于解析傳入的HTML表單數據的node.js模塊。

let Busboy = require('busboy');

//通過請求頭信息創建busboy對象??headers - 這些是傳入請求的 HTTP 標頭,由各個解析器使用 preservePath - ?是否應保留請求中文件部分的文件名中的路徑 ?limits - 對傳入數據的各種限制

let busboy = new Busboy({ headers: req.headers });

//將流鏈接到busboy對象

req.pipe(busboy);

//此事件由找到的每個文件字段發出

busboy.on('file', function (filedname, file, filename, encoding, mimetype) {//(字段名,文件,文件名,傳輸編碼,mime類型)

????//創建一個可寫流

????let writeStream = fs.createWriteStream('./upload/' + filename);

????//監聽data事件,接收傳過來的文件,如果文件過大,此事件將會執行多次,此方法必須寫在file方法里

????file.on('data', function (data) {

????????writeStream.write(data);

????})

????//監聽end事件,文件數據接收完畢,關閉這個可寫流

????file.on('end', function (data) {

????????writeStream.end();

????});

});

????//監聽finish完成事件,完成后重定向到百度首頁

????busboy.on('finish', function () {

????????res.writeHead(303, { Connection: 'close', Location: 'http://www.baidu.com/' });

????????res.end();

????});

});

//此事件由找到的每個新的非文件字段發出

busboy.on('field', (name, val, info) => {

??????console.log(`Field [${name}]: value: %j`, val);

????});

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20469.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20469.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20469.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Unity + 雷達 粒子互動(待更新)

效果預覽: 花海(帶移動方向) VFX 實例 腳本示例 使用TouchScript,計算玩家是否移動,且計算移動方向 using System.Collections; using System.Collections.Generic; using TouchScript; using TouchScript.Pointers; using UnityEngine; using UnityEngine.VFX;public …

AI預測福彩3D采取888=3策略+和值012路一縮定乾坤測試6月1日預測第8彈

今天繼續基于8883的大底,使用盡可能少的條件進行縮號。好了,直接上結果吧~ 首先,888定位如下: 百位:6,5,4,7,8,9,1,0 十位:7,8,6,5,9,3,1,0 個位:5,7,6,4,2,…

看廣告賺金幣提現小游戲app開發源碼

開發一個看廣告賺金幣并可以提現的小游戲APP,源碼的搭建涉及到多個方面,包括前端界面設計、后端邏輯處理、數據庫管理以及廣告平臺的對接等。以下是一些建議的步驟和考慮因素: 前端界面設計: 使用HTML5、CSS3和JavaScript等技術…

第十三屆藍橋杯B組c++國賽

A - 2022: 題目: 筆記: 一道經典的dp題: (1)明確dp數組含義: dp[i][j][k]: 表示前i個數字中選擇j個湊成k的方法數。 (2)確定狀態轉移方程: dp[i][j][k…

C++中的引用和解引用,及在Lambda中的簡單使用

目錄 摘要 引用(Reference) 定義 用法 解引用(Dereference) 定義 用法 Lambda表達式結合引用和解引用 引用結合Lambda表達式 解引用結合Lambda表達式 較為復雜的使用 總結 摘要 在C中,引用(Re…

linux 內核哪種鎖可以遞歸調用 ?

當數據被多線程并發訪問(讀/寫)時,需要對數據加鎖。linux 內核中常用的鎖有兩類:自旋鎖和互斥體。在使用鎖的時候,最常見的 bug 是死鎖問題,死鎖問題很多時候比較難定位,并且影響較大。本文先會介紹兩種引起死鎖的原因…

Java-----String類

1.String類的重要性 經過了C語言的學習,我們認識了字符串,但在C語言中,我們表示字符串進行操作的話需要通過字符指針或者字符數組,可以使用標準庫中提供的一系列方法對字符串的內容進行操作,但這種表達和操作數據的方…

溝通程序化(1):跟著鬼谷子學溝通—“飛箝”之術

溝通的基礎需要傾聽,但如果對方聽不進你的話,即便你說的再有道理,對方也很難入心。讓我們看看鬼谷子的“飛箝”之術能給我們帶來什么樣的啟發吧! “飛箝”之術,源自中國古代兵法家、縱橫家鼻祖鬼谷子的智慧&#xff0…

SpringBootWeb 篇-深入了解 Spring 異常處理、事務管理和配置文件參數配置化、yml 配置文件

🔥博客主頁: 【小扳_-CSDN博客】 ?感謝大家點贊👍收藏?評論? 文章目錄 1.0 配置文件 1.1 yml 配置文件 1.2 參數配置化 1.2.1 使用 Value 注解注入單個配置參數 1.2.2 使用 ConfigurationProperties 注解將一組相關配置參數注入到一個類中…

discuz論壇怎么修改備案信息

大家好,今天給大家分享下discuz如何填寫備案信息并且展示在網站首頁。大家都知道國內網站都需要備案,不通過備案的網站上是沒辦法通過域名打開的。大家也可以通過搜索網創有方,或者直接點擊網創有方 查看懸掛備案號后的效果。 首先大家可以看…

如何在CentOS中合理劃分磁盤空間以優化系統性能

目錄 前言 理想的分區方案 為什么需要單獨分區 安全性 性能 管理和維護 穩定性和可靠性 升級和兼容性 結論 前言 在進行CentOS系統的安裝和配置時,合理劃分磁盤空間是確保系統性能、安全性和易于管理的關鍵步驟。本文將探討如何根據系統的硬件配置和預期用途…

安全測試掃描利器-Burpsuite

🔥 交流討論:歡迎加入我們一起學習! 🔥 資源分享:耗時200小時精選的「軟件測試」資料包 🔥 教程推薦:火遍全網的《軟件測試》教程 📢歡迎點贊 👍 收藏 ?留言 &#x1…

vscode常用插件及插件安裝方式

一、常用插件 Chinese (Simplified) (簡體中文) Language Pack for Visual Studio Code 說明:中文語言包擴展(簡體) open in browser 說明:可以在默認瀏覽器或應用程序中打開當前文件 Auto Rename Tag 說明:自動重…

Linux 命令:awk

1. 寫在前面 本文主要介紹 Linux “awk” 命令:“awk” 是另一個強大的文本處理工具,用于處理和操作結構化數據,如日志文件和命令輸出。它可以根據需要為我們打印特定的列值。 公眾號: 滑翔的紙飛機 2. awk 命令 我們能用 awk 做…

Android 控件保持寬高比得幾種方式

文章目錄 Android 控件保持寬高比得幾種方式adjustViewBounds百分比布局ConstraintLayout自定義View Android 控件保持寬高比得幾種方式 adjustViewBounds 僅適用于 ImageView&#xff0c;保持橫豎比。 <ImageViewandroid:layout_width"match_parent"android:l…

動態規劃(Dynamic-Programming)問題講解

動態規劃類問題 從已知子問題的解&#xff0c;推導出當前問題的解 推導過程可以表達為一個數學公式用一維或二維數組來保存之前的計算結果&#xff08;可以進一步降維優化&#xff09; 將當前問題 分解成子問題 &#xff0c;找出遞歸公式&#xff0c;分階段進行求解 求解過程中…

vue3+ts封裝一個button組件

創建一個新的Button組件文件 Button.vue&#xff1a; <template><button :class"buttonClass" :disabled"disabled" click"handleClick"><slot></slot><i v-if"icon" :class"icon"></i&g…

python 生成器yield

生成器 創建生成器的方式 生成器推導式yield關鍵字 生成器相關方法 for&#xff1a;循環遍歷生成器中的每一個值next&#xff1a;獲取生成器中的下一個值 生成器注意點 代碼執行到yield會暫停&#xff0c;然后把結果返回出去&#xff0c;下次啟動生成器會在暫停的位置繼續執行…

進程間通信(27000字超詳解)

&#x1f30e;進程間通信 文章目錄&#xff1a; 進程間通信 進程間通信簡介 ??????進程間通信目的 ??????初識進程間通信 ??????進程間通信的分類 匿名管道通信 ??????認識管道 ??????匿名管道 ??????匿名管道測試 ??????管道的四種…

第十五課,海龜畫圖:抬筆與落筆函數、畫曲線函數

一&#xff0c;turtle.penup()和turtle.pendown()&#xff1a;抬起與落下畫筆函數 當使用上節課學習的這個turtle.forward()&#xff1a;畫筆前進函數時&#xff0c;畫筆會朝著當前方向在畫布上留下一條指定&#xff08;像素&#xff09;長度的直線&#xff0c;但你可能發現&a…