首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Web 文件上傳實戰:附件存檔案系統而非資料庫的最佳實踐

     編輯:Java 相關知識

將上傳檔案以 BLOB/CLOB 存入資料庫雖然集中管理,但會暴增 DB 體積、備份緩慢、讀取需串流處理。業界主流做法是:檔案存檔案系統,資料庫僅存相對路徑。本文示範使用 Apache Commons FileUpload 元件實作多檔上傳、儲存至 Web 專案 /picture 目錄、並回寫相對路徑至資料庫的完整流程。

架構優勢

  • 資料庫輕量化,備份/遷移極快。
  • 靜態檔案可直接由 Web Server(Nginx/Apache/Tomcat)高效服務,無需經過 Java 處理。
  • 支援 CDN 加速、瀏覽器快取、斷點續傳等 HTTP 特性。
  • 檔案操作用原生 IO,效能遠超資料庫串流。

核心實作步驟

1. 依賴引入

<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>

2. Servlet / Controller 處理上傳

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, ...);
    }
}

3. 前端表單關鍵屬性

<form action="upload" method="post" enctype="multipart/form-data">
    <input type="file" name="attach" multiple>
    <button type="submit">上傳</button>
</form>

4. 讀取顯示與下載

<!-- 圖片直接顯示 -->
<img src="<%=relativePath%>" width="220" height="170">

<!-- 文件下載連結 -->
<a href="<%=relativePath%>" target="_blank">下載附件</a>

進階強化建議

  • 檔名去重:UUID + 原始副檔名,避免同名覆蓋。
  • 副檔名/MIME 白名單驗證,防惡意上傳脚本。
  • 病毒掃描整合(ClamAV/ICAP)。
  • 大檔分片上傳(Plupload/Resumable.js)+ 斷點續傳。
  • 雲端儲存(S3/OSS)替代本地磁碟,支援水平擴展。
  • 資料庫記錄:原始檔名、儲存路徑、大小、上傳者、時間、MD5/SHA256 校驗碼。

注意事項

範例使用舊版 DiskFileUpload,新版建議改用 ServletFileUpload 搭配 FileItemFactory。生產環境務必設定上傳大小限制、暫存目錄權限、定期清理孤立暫存檔。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved