
- Node.js 教程
- Node.js - 首頁
- Node.js - 簡介
- Node.js - 環境搭建
- Node.js - 第一個應用程式
- Node.js - REPL 終端
- Node.js - 命令列選項
- Node.js - 包管理器 (NPM)
- Node.js - 回撥函式概念
- Node.js - 上傳檔案
- Node.js - 傳送郵件
- Node.js - 事件
- Node.js - 事件迴圈
- Node.js - 事件發射器
- Node.js - 偵錯程式
- Node.js - 全域性物件
- Node.js - 控制檯
- Node.js - 程序
- Node.js - 應用程式擴充套件
- Node.js - 打包
- Node.js - Express 框架
- Node.js - RESTFul API
- Node.js - 緩衝區
- Node.js - 流
- Node.js - 檔案系統
- Node.js MySQL
- Node.js - MySQL 入門
- Node.js - MySQL 建立資料庫
- Node.js - MySQL 建立表
- Node.js - MySQL 插入資料
- Node.js - MySQL 查詢資料
- Node.js - MySQL 條件查詢
- Node.js - MySQL 排序
- Node.js - MySQL 刪除資料
- Node.js - MySQL 更新資料
- Node.js - MySQL 聯接
- Node.js MongoDB
- Node.js - MongoDB 入門
- Node.js - MongoDB 建立資料庫
- Node.js - MongoDB 建立集合
- Node.js - MongoDB 插入資料
- Node.js - MongoDB 查詢資料
- Node.js - MongoDB 查詢
- Node.js - MongoDB 排序
- Node.js - MongoDB 刪除資料
- Node.js - MongoDB 更新資料
- Node.js - MongoDB 限制
- Node.js - MongoDB 聯接
- Node.js 模組
- Node.js - 模組
- Node.js - 內建模組
- Node.js - 實用程式模組
- Node.js - Web 模組
- Node.js 有用資源
- Node.js - 快速指南
- Node.js - 有用資源
- Node.js - 討論
Node.js - 上傳檔案
在許多 Web 應用程式中,客戶端機器上的使用者需要將檔案(例如使用者使用 Facebook 或 Instagram 應用程式上傳影像和影片)上傳到伺服器。NPM 登錄檔上提供了許多開源模組,可以使用這些模組在 Node.js 應用程式中啟用上傳檔案的功能。formidable 模組提供了一個方便的 API 來處理檔案上傳。formidable 模組可以匯入到核心 Node.js 模組中,以及內建的 http 模組和 Express 應用程式中。
Formidable
Formidable 模組是一個快速且流式處理的多部分解析器,能夠自動將檔案上傳寫入磁碟。它佔用記憶體少,並且具有高效的錯誤處理機制。
第一步,使用以下命令安裝 formidable 模組:
npm install formidable
在本節中,下面顯示了在包含 http 模組的 Node.js 應用程式和 ExpressJs 應用程式中使用 Formidable 模組的示例用法:
使用 Node.js http 模組
以下示例呼叫 createServer() 函式啟動 Node.JS 伺服器,並呈現一個多部分 HTML 表單,供使用者選擇要上傳的檔案。
提交檔案後,表單資料將被解析,並且上傳的檔案將複製到磁碟上的預設位置。
var http = require('http'); var formidable = require('formidable'); var errors = formidable.formidableErrors; const server = http.createServer(async (req, res) => { if (req.url === '/api/upload' && req.method.toLowerCase() === 'post') { // parse a file upload const form = new formidable.IncomingForm(); let fields; let files; try { [fields, files] = await form.parse(req); } catch (err) { res.writeHead(err.httpCode || 400, { 'Content-Type': 'text/plain' }); res.end(String(err)); return; } res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ fields, files }, null, 2)); return; } // show a file upload form res.writeHead(200, { 'Content-Type': 'text/html' }); res.end(` <h2>With Node.js <code>"http"</code> module</h2> <form action="/api/upload" enctype="multipart/form-data" method="post"> <div>Text field title: <input type="text" name="title" /></div> <div>File: <input type="file" name="multipleFiles" multiple="multiple" /></div> <input type="submit" value="Upload" /> </form> `); }); server.listen(5000, () => { console.log('Server listening on https://:5000/ ...'); });
執行應用程式後,瀏覽器將顯示以下表單以選擇要上傳的檔案。

上傳操作成功後,瀏覽器將顯示以下結果:
{ "fields": { "title": [ "test" ] }, "files": { "multipleFiles": [ { "size": 4203211, "filepath": "C:\\Users\\user\\AppData\\Local\\Temp\\930f2f754006b790729e0d200", "newFilename": "930f2f754006b790729e0d200", "mimetype": "image/png", "mtime": "2023-12-24T08:04:09.856Z", "originalFilename": "1.png" } ] } }
使用 Express.js
在 Express.JS 程式碼中使用 formidable 模組的最簡單用法如下:
import express from 'express'; import formidable from 'formidable'; const app = express(); app.get('/', (req, res) => { res.send(` <h2>With <code>"express"</code> npm package</h2> <form action="/api/upload" enctype="multipart/form-data" method="post"> <div>Text field title: <input type="text" name="title" /></div> <div>File: <input type="file" name="someExpressFiles" multiple="multiple" /></div> <input type="submit" value="Upload" /> </form> `); }); app.post('/api/upload', (req, res, next) => { const form = formidable({}); form.parse(req, (err, fields, files) => { if (err) { next(err); return; } res.json({ fields, files }); }); }); app.listen(5000, () => { console.log('Server listening on https://:5000 ...'); });
您還可以安裝並使用 body-parser 模組來解析上傳過程中多部分 HTML 表單資料。
Multer
另一個能夠處理檔案上傳的有用 NPM 模組稱為 Multer。使用者可以一次上傳一個或多個檔案。
要安裝,請使用以下命令:
npm install multer
在 Express 應用程式的開頭,包含 Multer 並宣告 Multer 物件。
const multer = require('multer') const upload = multer({ dest: 'uploads/' })
假設您有一個路由來處理 GET 請求並顯示一個將表單釋出到 /upload 路由的多部分 HTML 表單,請新增以下函式來處理 POST 請求:
app.post("/upload", upload.single("myFile"), (req, res) => { console.log("Body: ", req.body); console.log("File: ", req.file); res.send("File successfully uploaded."); });
要將上傳的檔案儲存在指定位置而不是臨時檔案的預設位置,請配置 Multer 位置如下:
var storage = multer.diskStorage({ destination: function(req, file, cb) { // destination is used to specify the path of the directory in which the files have to be stored cb(null, './uploads'); }, filename: function (req, file, cb) { // It is the filename that is given to the saved file. cb(null , file.originalname); } }); // Configure storage engine instead of dest object. const upload = multer({ storage: storage })