首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 多圖上傳服務端覆蓋問題:檔案命名衝突與解決方案

     編輯:程式設計綜合問答

現象

客戶端迴圈上傳多張圖,服務端只收到最後一張 (或所有請求寫入同一檔案)。

根因

服務端儲存邏輯使用**固定檔名** (如 upload.jpg) 或**未包含唯一標識**的命名規則,導致後續請求覆蓋前一個檔案。

解決方案

方案一:客戶端生成唯一檔名 (推薦)

// Android
String fileName = System.currentTimeMillis() + "_" + UUID.randomUUID().toString().substring(0,8) + ".jpg";
request.addParameter("fileName", fileName);

服務端直接使用該檔名儲存。

方案二:服務端生成唯一檔名

// Spring MVC
@PostMapping("/upload")
public ResponseEntity upload(@RequestParam MultipartFile file) {
    String ext = FilenameUtils.getExtension(file.getOriginalFilename());
    String storedName = UUID.randomUUID().toString().replace("-", "") + "." + ext;
    Path dest = uploadRoot.resolve(storedName);
    file.transferTo(dest);
    // 回傳 storedName 供客戶端關聯業務
    return ResponseEntity.ok(Collections.singletonMap("storedName", storedName));
}

方案三:資料庫記錄原始檔名 + 存儲檔名映射

CREATE TABLE uploads (
    id BIGSERIAL PK,
    original_name VARCHAR(255),
    stored_name VARCHAR(64) UNIQUE,
    uploader_id BIGINT,
    created_at TIMESTAMP DEFAULT NOW()
);

最佳實踐清單

  • **永不信任客戶端檔名**,防止路徑遍歷 (`../../etc/passwd`)。
  • **分散式儲存** (MinIO/S3/OSS) 直接回傳 Object Key,無本地檔案系統衝突。
  • **冪等上傳**:客戶端計算檔案 SHA-256,服務端按雜湊值去重。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved