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

Struts2 + Ajax 上傳 GIF 變靜態:文件大小對比與處理鏈路排查

     編輯:程式設計綜合問答

上傳 PNG/JPG 正常,GIF 變靜態,排查三步走:

1. 確認文件大小是否變化

  • 上傳前後 `ls -l` / 瀏覽器開發者工具 Network 面板看 `Content-Length`。
  • **大小不變** → 文件完整,可能是**查看器/縮略圖生成**丟幀,用 `identify -verbose a.gif` (ImageMagick) 驗證幀數。
  • **大小變小** → 服務端處理鏈路截斷/重編碼。

2. 追蹤代碼關鍵節點

// Action 中
File upload; String uploadFileName;
public String execute() {
    // 1. Struts2 默認保存到臨時目錄 (request.getAttribute("upload")) 
    // 2. 複製到目標目錄
    FileUtils.copyFile(upload, new File(savePath, uploadFileName));
    // 3. 是否調用了圖片處理庫 (ImageIO/Thumbnailator/Imgscalr) 重寫?
    //    BufferedImage img = ImageIO.read(upload); // ImageIO 不支持寫入多幀 GIF!
    //    ImageIO.write(img, "gif", out);         // 只寫第一幀 → 靜態
}

3. 修正方案

  • **純轉存不處理** → 直接 `Files.copy` / `FileUtils.copyFile` 保留原始字節。
  • **需處理 (壓縮/水印/縮略圖)** → 用 **ImageMagick (`magick convert`)** 或 **GraphicsMagick** 命令行,支持多幀 GIF 操作:`magick input.gif -resize 50% output.gif`。
  • Java 代碼調用:`Runtime.getRuntime().exec("magick ...")` 或封裝庫 `im4java` / `gm4java`。

核心教訓:**Java ImageIO 不支持寫入動畫 GIF**,任何經過 `ImageIO.write` 的 GIF 必變靜態。

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