Node.js - 上傳文件:初學者指南
你好,未來的編程超新星!歡迎來到我們令人興奮的Node.js文件上傳之旅。作為你友好的鄰居計算機老師,我非常高興能夠引導你進行這次冒險。如果你以前從未寫過一行代碼,也不要擔心——我們會從頭開始,逐步建立。在這個教學的結尾,你將會像專家一樣上傳文件!
Node.js文件上傳介紹
在我們深入細節之前,讓我們先討論一下為什麼文件上傳這麼重要。想像一下,你正在創建一個社交媒體應用程序,用戶可以分享照片。或者也許你正在為一家公司建立文件管理系統。在這兩種情況下,你都需要一種方式讓用戶將文件發送到你的服務器。這就是文件上傳的用處!
我們可靠的JavaScript運行時Node.js提供了多種處理文件上傳的方法。今天,我們將專注於兩個流行的庫:Formidable和Multer。將這些看作是你的文件上傳超級英雄,每個都有自己獨特的能力!
Formidable:你的第一位文件上傳助手
Formidable是什麼?
Formidable就像那個總是準備幫你搬家的可靠朋友。它是一個Node.js模塊,可以讓解析表單數據(尤其是文件上傳)變得非常容易。讓我們看看如何使用它!
設置Formidable
首先,我們需要安裝Formidable。打開你的終端並輸入:
npm install formidable
這個命令就像去超級英雄商店並選擇你的Formidable服裝。現在,你已經準備好開始上傳了!
使用Formidable的基本文件上傳
讓我們創建一個能夠處理文件上傳的簡單服務器。這裡是代碼:
const http = require('http');
const formidable = require('formidable');
const fs = require('fs');
http.createServer((req, res) => {
if (req.url == '/fileupload') {
const form = new formidable.IncomingForm();
form.parse(req, (err, fields, files) => {
const oldPath = files.filetoupload.filepath;
const newPath = 'C:/Users/YourName/uploads/' + files.filetoupload.originalFilename;
fs.rename(oldPath, newPath, (err) => {
if (err) throw err;
res.write('文件已上傳並移動!');
res.end();
});
});
} else {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');
res.write('<input type="file" name="filetoupload"><br>');
res.write('<input type="submit">');
res.write('</form>');
return res.end();
}
}).listen(8080);
讓我們分解這段代碼:
- 我們使用
http.createServer()
創建一個服務器。 - 如果URL是'/fileupload',我們使用Formidable來解析來的表單。
- 我們將上傳的文件從臨時位置移動到永久位置。
- 如果URL是其他任何東西,我們顯示一個簡單的上傳表單。
處理多個文件上傳
如果你想要一次性上傳多個文件呢?沒問題!這裡是如何修改代碼:
const http = require('http');
const formidable = require('formidable');
const fs = require('fs');
http.createServer((req, res) => {
if (req.url == '/fileupload') {
const form = new formidable.IncomingForm();
form.multiples = true;
form.parse(req, (err, fields, files) => {
if (Array.isArray(files.filetoupload)) {
files.filetoupload.forEach((file) => {
const oldPath = file.filepath;
const newPath = 'C:/Users/YourName/uploads/' + file.originalFilename;
fs.rename(oldPath, newPath, (err) => {
if (err) throw err;
});
});
} else {
const oldPath = files.filetoupload.filepath;
const newPath = 'C:/Users/YourName/uploads/' + files.filetoupload.originalFilename;
fs.rename(oldPath, newPath, (err) => {
if (err) throw err;
});
}
res.write('文件已上傳並移動!');
res.end();
});
} else {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');
res.write('<input type="file" name="filetoupload" multiple><br>');
res.write('<input type="submit">');
res.write('</form>');
return res.end();
}
}).listen(8080);
這裡的主要改變是:
- 我們設置
form.multiples = true
以允許多個文件上傳。 - 我們檢查
files.filetoupload
是否為數組(多個文件)或對象(單個文件)。 - 如果需要,我們使用
forEach
來處理多個文件。
Multer:新來者
Multer介紹
現在,讓我們來見見我們的第二個文件上傳超級英雄:Multer。Multer就像Formidable的更酷、更年輕的兄弟姐妹。它專門設計用於處理multipart/form-data
,這對文件上傳來說非常完美。
設置Multer
要開始使用Multer,使用npm進行安裝:
npm install multer
使用Multer的基本文件上傳
這裡是如何使用Multer的簡單示例:
const express = require('express');
const multer = require('multer');
const path = require('path');
const app = express();
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'uploads/')
},
filename: function (req, file, cb) {
cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname))
}
});
const upload = multer({ storage: storage });
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
});
app.post('/upload', upload.single('filetoupload'), (req, res, next) => {
const file = req.file;
if (!file) {
const error = new Error('請上傳一個文件');
error.httpStatusCode = 400;
return next(error);
}
res.send(file);
});
app.listen(3000, () => console.log('服務器已在端口3000啟動'));
讓我們分解這段代碼:
- 我們設置一個存儲引擎,告訴Multer將文件存儲在哪裡以及如何命名。
- 我們使用我們的存儲設置創建一個上傳實例。
- 我們定義一個路由用於上傳表單和另一個路由用於處理文件上傳。
- 在上傳路由中,我們使用
upload.single('filetoupload')
來處理單個文件上傳。
使用Multer處理多個文件上傳
Multer讓處理多個文件上傳變得非常容易。這樣做:
app.post('/upload', upload.array('filetoupload', 12), (req, res, next) => {
const files = req.files;
if (!files) {
const error = new Error('請選擇文件');
error.httpStatusCode = 400;
return next(error);
}
res.send(files);
});
這裡的主要改變是使用upload.array('filetoupload', 12)
而不是upload.single()
。'12'指定了最多12個文件。
比較Formidable和Multer
現在我們已經看到了Formidable和Multer的實際應用,讓我們比較一下它們:
特性 | Formidable | Multer |
---|---|---|
使用難度 | 簡單直觀 | 需要更多的設置,但提供更多的控制 |
網絡集成 | 與任何Node.js服務器配合使用 | 設計用於與Express配合使用 |
文件處理 | 可以同時處理文件和字段 | 專門為文件上傳設計 |
自定義 | 較不靈活 | 高度可自定義 |
多個文件上傳 | 需要額外的代碼 | 內置支持 |
結論
恭喜你!你剛剛通過學習如何處理Node.js中的文件上傳來提升了自己的Node.js技能。無論你選擇Formidable還是Multer,你現在都已經有能力為你的Node.js應用程序添加文件上傳功能。
記住,熟能生巧。嘗試建立一個使用文件上傳的小項目——也許是一個簡單的圖片分享應用程序或文件存儲系統。你編寫的代碼越多,你就會越熟悉這些概念。
快樂編程,願你的上傳總是成功!
Credits: Image by storyset