使用 JavaScript 與 Node.js 實現檔案上傳與儲存到伺服器

閱讀時間約 9 分鐘

檔案上傳是許多網站的核心功能,無論是上傳圖片、文件,甚至是大型的資料檔案。本文將教您如何使用 JavaScript 與 Node.js 搭配 Express 與 Multer 套件,實現檔案上傳功能,並將檔案儲存至伺服器指定的目錄中。

必要工具

在開始實作前,請先安裝以下工具與套件:

  1. Node.js 與 npm(Node.js 安裝時會自動包含 npm)。
  2. 安裝必要的 Node.js 套件:
npm install express multer


建立專案目錄

創建一個專案目錄,並確保目錄結構如下:

project/
├── public/ // 用來放置前端檔案
│ └── index.html // 前端上傳介面
├── uploads/ // 儲存上傳檔案的目錄
├── server.js // 伺服器端程式碼
├── package.json // 套件資訊檔
└── package-lock.json // 自動生成的檔案


實作前端介面

前端部分提供一個檔案選擇器與按鈕,透過表單提交檔案。此範例加入了一個輸入框,讓使用者可以指定檔案的儲存路徑。

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>檔案上傳</title>
</head>
<body>
<h1>上傳檔案</h1>
<form id="uploadForm" enctype="multipart/form-data">
<input type="text" name="path" id="pathInput" placeholder="請輸入儲存路徑" />
<input type="file" name="file" id="fileInput" />
<button type="button" onclick="uploadFile()">上傳</button>
</form>

<script>
async function uploadFile() {
const fileInput = document.getElementById('fileInput');
const pathInput = document.getElementById('pathInput');
const formData = new FormData();
formData.append('file', fileInput.files[0]);
formData.append('path', pathInput.value);

const response = await fetch('/upload', {
method: 'POST',
body: formData,
});

if (response.ok) {
alert('檔案上傳成功!');
} else {
alert('檔案上傳失敗');
}
}
</script>
</body>
</html>


建立伺服器端程式碼

使用 Express 與 Multer 在伺服器端處理檔案上傳,並根據前端指定的路徑儲存檔案。

server.js:

const express = require('express');
const multer = require('multer');
const path = require('path');
const fs = require('fs');

const app = express();
const PORT = 3000;

// 動態設定儲存目錄與檔案命名
const storage = multer.diskStorage({
destination: (req, file, cb) => {
const userPath = req.body.path || 'uploads'; // 預設為 uploads 資料夾
const fullPath = path.join(__dirname, userPath);

// 確保目錄存在
fs.mkdirSync(fullPath, { recursive: true });
cb(null, fullPath);
},
filename: (req, file, cb) => {
cb(null, `${Date.now()}-${file.originalname}`); // 用時間戳加檔名區分
},
});

const upload = multer({ storage });

// 提供靜態檔案
app.use(express.static(path.join(__dirname, 'public')));

// 接收檔案的路由
app.post('/upload', upload.single('file'), (req, res) => {
if (!req.file) {
return res.status(400).send('未選擇檔案');
}
res.send(`檔案已成功上傳到:${req.body.path || 'uploads'}`);
});

// 啟動伺服器
app.listen(PORT, () => {
console.log(`伺服器運行於 http://localhost:${PORT}`);
});


啟動專案

  1. 在專案目錄下執行以下指令,啟動伺服器:
    node server.js
  2. 在瀏覽器中開啟 http://localhost:3000,並測試檔案上傳功能。
  3. 成功上傳後,檔案將儲存在前端輸入的指定路徑(如未指定,則預設為 uploads/ 資料夾)。


延伸功能

1. 限制檔案大小

可以設定最大檔案大小來避免伺服器資源耗盡。

const upload = multer({
storage,
limits: { fileSize: 5 * 1024 * 1024 }, // 最大 5MB
});

2. 支援多檔案上傳

app.post('/upload-multiple', upload.array('files', 10), (req, res) => {
if (!req.files || req.files.length === 0) {
return res.status(400).send('未選擇檔案');
}
res.send('多檔案上傳成功!');
});

3. 文件格式驗證

僅允許特定檔案類型:

const upload = multer({
storage,
fileFilter: (req, file, cb) => {
const fileTypes = /jpeg|jpg|png|pdf/; // 限制上傳格式
const mimeType = fileTypes.test(file.mimetype);
const extName = fileTypes.test(path.extname(file.originalname).toLowerCase());

if (mimeType && extName) {
cb(null, true);
} else {
cb(new Error('不支援的檔案類型'));
}
},
});


結語

透過上述的教學,我們實現了一個可指定儲存路徑的檔案上傳功能,並介紹了多種擴展功能。你可以根據實際需求進一步強化此功能,例如加入安全性檢查、進階的檔案分類邏輯,甚至整合到資料庫中儲存檔案資訊。

希望本文能幫助你了解檔案上傳的基礎概念與實作方式!

avatar-img
67會員
120內容數
這裡將以輕鬆風格,深入探討程式設計的基礎和高級概念。從程式語言到演算法,我們將以易懂的方式解釋每個主題,讓你輕鬆掌握。無論你是初學者或有經驗者,都能在這裡找到適合你的內容。無論你的目標是成為專業開發者還是擴展知識,我們都會陪伴你一同成長!
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
程式輕鬆玩 的其他內容
台灣人常有一種「自我內耗」和「過度自省」的傾向,彷彿生活在無形的壓力中,不得不對自己加倍嚴格。這種情況從教育到職場、從家庭到人際關係,無處不在。今天就讓我們用輕鬆的角度來聊聊這個話題,看看這些壓力源頭從哪來,又有什麼辦法可以讓自己「輕鬆一點」。
在 Excel 中,我們經常需要根據儲存格的內容來自動更改其格式,這不僅能使數據更直觀,也有助於提升工作效率。本文將介紹如何使用 VBA 程式碼來實現自動更改儲存格顏色的功能,依據輸入的儲存格內容及其所在列的第一列值進行判斷。
在 Excel 中,當我們處理大量數據時,能夠快速地突出顯示某一列的資料是非常實用的。本文將介紹如何透過 VBA(Visual Basic for Applications)來實現當點選某一個儲存格時,自動將該儲存格所在的整列改變顏色的功能。
在這篇教學文章中,我們將展示如何使用 Node.js 來製作一個簡單的日曆應用程式。這個應用程式將允許用戶查看日曆、添加事件、刪除事件和更新事件。通過這個過程,我們將使用 Express 來建立伺服器,並使用 FullCalendar 來呈現前端的日曆。
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
在這篇教學中,我們將介紹如何使用 Excel VBA 來發送訊息到 LINE Notify。LINE Notify 是 LINE 提供的服務,可以透過 API 發送訊息到 LINE 上。這篇教學將帶你步驟一步完成設置。
台灣人常有一種「自我內耗」和「過度自省」的傾向,彷彿生活在無形的壓力中,不得不對自己加倍嚴格。這種情況從教育到職場、從家庭到人際關係,無處不在。今天就讓我們用輕鬆的角度來聊聊這個話題,看看這些壓力源頭從哪來,又有什麼辦法可以讓自己「輕鬆一點」。
在 Excel 中,我們經常需要根據儲存格的內容來自動更改其格式,這不僅能使數據更直觀,也有助於提升工作效率。本文將介紹如何使用 VBA 程式碼來實現自動更改儲存格顏色的功能,依據輸入的儲存格內容及其所在列的第一列值進行判斷。
在 Excel 中,當我們處理大量數據時,能夠快速地突出顯示某一列的資料是非常實用的。本文將介紹如何透過 VBA(Visual Basic for Applications)來實現當點選某一個儲存格時,自動將該儲存格所在的整列改變顏色的功能。
在這篇教學文章中,我們將展示如何使用 Node.js 來製作一個簡單的日曆應用程式。這個應用程式將允許用戶查看日曆、添加事件、刪除事件和更新事件。通過這個過程,我們將使用 Express 來建立伺服器,並使用 FullCalendar 來呈現前端的日曆。
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
在這篇教學中,我們將介紹如何使用 Excel VBA 來發送訊息到 LINE Notify。LINE Notify 是 LINE 提供的服務,可以透過 API 發送訊息到 LINE 上。這篇教學將帶你步驟一步完成設置。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
Thumbnail
Node.js是一個JavaScript運行環境。它使用了一個非阻塞、事件驅動的I/O模型,使其非常適合用於數據密集型的即時應用程序。簡單來說,Node.js允許你使用JavaScript來編寫伺服器端代碼。 nvm 安裝nvm Windows : 點擊 Releases · coreybut
Thumbnail
此為不負責任教學,介面操作依實際情況而有所異動 額外資源參考 [API] 串接 Imgur API 圖床服務,上傳到指定相簿 israynotarray超完整 Express Imgur 套件上傳教學 [前端筆記] 用 axios 串接 imgur API上傳圖片
Thumbnail
Express 是一個流行的 web 框架,使用 JavsScript 實現,執行在 node 環境上,主要用來寫後端應用。
※ Express 專案步驟筆記清單 Node.js 環境建置核對 新增專案資料夾 設定 package.json npm init -y 設定程式入口為 app.js 安裝 Express:npm install express 設定主程式 app.js 建構應用程式伺服器 設定
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
Thumbnail
Node.js是一個JavaScript運行環境。它使用了一個非阻塞、事件驅動的I/O模型,使其非常適合用於數據密集型的即時應用程序。簡單來說,Node.js允許你使用JavaScript來編寫伺服器端代碼。 nvm 安裝nvm Windows : 點擊 Releases · coreybut
Thumbnail
此為不負責任教學,介面操作依實際情況而有所異動 額外資源參考 [API] 串接 Imgur API 圖床服務,上傳到指定相簿 israynotarray超完整 Express Imgur 套件上傳教學 [前端筆記] 用 axios 串接 imgur API上傳圖片
Thumbnail
Express 是一個流行的 web 框架,使用 JavsScript 實現,執行在 node 環境上,主要用來寫後端應用。
※ Express 專案步驟筆記清單 Node.js 環境建置核對 新增專案資料夾 設定 package.json npm init -y 設定程式入口為 app.js 安裝 Express:npm install express 設定主程式 app.js 建構應用程式伺服器 設定