專案功能
- 圖片上傳(支援多文件、描述)。
- 相冊瀏覽(縮略圖、大圖查看)。
- 圖片下載(Content-Disposition)。
- 圖片刪除(僅限上傳者 IP)。
技術棧
- Servlet / JSP
- Commons FileUpload + Commons IO(文件上傳)
- Dom4j + Jaxen(XML 解析、XPath)
- Hash 目錄分散(優化文件系統性能)
核心模塊代碼
1. 工具類
// MyUtils:UUID、日期格式化、Hash 目錄生成
public static String getDir(String uuid) {
String dir1 = Integer.toHexString(uuid.hashCode() & 0xf);
String dir2 = Integer.toHexString((uuid.hashCode() & 0xf0) >> 4);
return "/" + dir1 + "/" + dir2; // 如 /a/3/
}
// Dom4jFactory:單例管理 Document,支援讀寫
static {
SAXReader sax = new SAXReader();
String path = Dom4jFactory.class.getClassLoader().getResource("photos.xml").getPath();
dom = sax.read(new FileInputStream(path));
}
public static boolean save() { /* XMLWriter 寫回磁盤 */ }
2. 值對象 PhotoModel
private String uuid, realName, ext, dir, dateTime, ip, desc;
// getter/setter/toString
3. DAO 層
// PhotoDao 介面
boolean save(PhotoModel photo);
List<PhotoModel> getAll();
PhotoModel getSingleById(String id);
boolean del(String id);
// PhotoDaoImpl:Dom4j 操作 XML
public boolean save(PhotoModel photo) {
Element root = dom.getRootElement();
Element e = root.addElement("photo");
e.addAttribute("uuid", photo.getUuid());
// ... 其他屬性
e.addElement("desc").setText(photo.getDesc());
return Dom4jFactory.save();
}
4. Servlet 控制器
- UploadServlet:解析 multipart 請求 → 封裝 PhotoModel → 寫 XML → 保存文件到 Hash 目錄。
- ShowServlet:讀取所有記錄 → 生成 HTML 表格展示圖片、描述、操作鏈接。
- DownServlet:設置
Content-Disposition: attachment → 輸出文件流,處理中文文件名編碼(IE/Firefox 兼容)。
- DelServlet:驗證 IP → 刪除 XML 節點 → 刪除物理文件 → 重定向列表頁。
關鍵技術點
| 技術點 | 實現要點 |
| 文件上傳 | ServletFileUpload.parseRequest,FileItem.isFormField() 區分普通欄位與文件 |
| 大文件/臨時目錄 | DiskFileItemFactory.setRepository(tempDir) |
| 目錄分散 | UUID hashCode 取低 8 位,分兩級 16 進制目錄,避免單目錄文件過多 |
| XML 存儲 | Dom4j 操作簡單,適合小數據量;大數據量建議遷移資料庫 |
| 下載中文名 | User-Agent 判斷瀏覽器,Firefox 用 ISO-8859-1,其他用 URLEncoder |
部署與運行
- 導入依賴 JAR:
commons-fileupload、commons-io、dom4j、jaxen。
- 配置
web.xml 映射 Servlet。
- 將
photos.xml 放入 src 目錄(編譯到 classes 根路徑)。
- 啟動 Tomcat 訪問
index.jsp。
擴展建議
- 引入資料庫(MySQL)替換 XML,支援併發與大數據量。
- 整合 Spring + MyBatis,分層解耦。
- 增加圖片壓縮、水印、格式轉換功能。
- 引入 Redis 緩存熱門相冊數據。
- 上一篇文章: Java 反射深度解析:從類載入到動態代理的完整實戰指南
- 下一篇文章: 妙解 Java 回調機制:從小明寫作業到婆婆算賬的生動演繹
Copyright ©
程式碼之家 All Rights Reserved