將上傳檔案以 BLOB/CLOB 存入資料庫雖然集中管理,但會暴增 DB 體積、備份緩慢、讀取需串流處理。業界主流做法是:檔案存檔案系統,資料庫僅存相對路徑。本文示範使用 Apache Commons FileUpload 元件實作多檔上傳、儲存至 Web 專案 /picture 目錄、並回寫相對路徑至資料庫的完整流程。
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
DiskFileUpload fu = new DiskFileUpload();
fu.setSizeMax(10_000_000); // 10MB 總上限
fu.setSizeThreshold(4096); // 4KB 以上寫暫存檔
fu.setRepositoryPath(System.getProperty("java.io.tmpdir"));
List items = fu.parseRequest(request);
for (FileItem item : items) {
if (!item.isFormField()) { // 忽略一般表單欄位
String fileName = item.getName();
if (fileName == null || fileName.isEmpty()) continue;
// 產生唯一檔名避免衝突(此處簡化用原檔名)
String saveDir = application.getRealPath("/picture");
File dest = new File(saveDir, fileName);
item.write(dest); // Commons FileUpload 自動處理暫存檔移動/清理
// 寫入資料庫:相對路徑 /picture/xxx.jpg
String relativePath = "/picture/" + fileName;
// dao.insertAttachment(relativePath, ...);
}
}
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="attach" multiple>
<button type="submit">上傳</button>
</form>
<!-- 圖片直接顯示 -->
<img src="<%=relativePath%>" width="220" height="170">
<!-- 文件下載連結 -->
<a href="<%=relativePath%>" target="_blank">下載附件</a>
範例使用舊版 DiskFileUpload,新版建議改用 ServletFileUpload 搭配 FileItemFactory。生產環境務必設定上傳大小限制、暫存目錄權限、定期清理孤立暫存檔。