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

Struts 2 文件上傳實戰:商品圖片上傳組件化封裝與 UUID 重命名

     編輯:Java 相關知識

商品管理模塊涉及圖片上傳需求,第 13 戰基於 Struts 2 文件上傳攔截器,構建可復用的 FileUpload 組件,實現多文件類型驗證、UUID 隨機重命名、指定目錄存儲、臨時文件自動清理的完整鏈路。

一、 文件信息封裝模型:FileImage

Struts 2 約定三屬性自動注入:

public class FileImage {
    private File file;           // 上傳文件臨時路徑
    private String contentType;  // MIME 類型
    private String filename;     // 原始文件名
    // Setter 命名約定:set + 屬性名首字母大寫
    public void setUpload(File file) { this.file = file; }
    public void setUploadContentType(String contentType) { this.contentType = contentType; }
    public void setUploadFileName(String filename) { this.filename = filename; }
    // Getter 省略
}

前端表單 <input type="file" name="fileImage.upload"/> 對應 setUpload。

二、 文件上傳組件接口與實現

1. 接口定義

public interface FileUpload {
    String uploadFile(FileImage fileImage); // 返回新文件名
}

2. 核心實現

@Component("fileUpload")
public class FileUploadUtil implements FileUpload {
    private String filePath; // 存儲根目錄,從 properties 注入

    @Value("#{prop.filePath}")
    public void setFilePath(String filePath) { this.filePath = filePath; }

    // 1. 獲取擴展名
    private String getFileExt(String fileName) {
        return FilenameUtils.getExtension(fileName); // Apache Commons IO
    }

    // 2. UUID 隨機文件名
    private String newFileName(String fileName) {
        return UUID.randomUUID().toString() + "." + getFileExt(fileName);
    }

    @Override
    public String uploadFile(FileImage fileImage) {
        String newName = newFileName(fileImage.getFilename());
        try {
            FileUtil.copyFile(fileImage.getFile(), new File(filePath, newName));
            return newName;
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            fileImage.getFile().delete(); // 清理臨時文件
        }
    }
}

三、 BaseAction 統一注入

@Controller("baseAction")
@Scope("prototype")
public class BaseAction<T> extends ActionSupport implements ModelDriven<T> {
    protected FileImage fileImage;
    @Resource protected FileUpload fileUpload;
    // Getter/Setter 省略
}

所有需要上傳功能的 Action 繼承 BaseAction 即可直接使用。

四、 ProductAction 極簡調用

public void save() throws Exception {
    String pic = fileUpload.uploadFile(fileImage);
    model.setPic(pic);
    model.setDate(new Date());
    productService.save(model);
}

public void update() throws Exception {
    String pic = fileUpload.uploadFile(fileImage);
    model.setPic(pic);
    model.setDate(new Date());
    productService.update(model);
}

業務邏輯零侵入,上傳細節完全屏蔽。

五、 前端驗證增強(EasyUI ValidateBox)

$.extend($.fn.validatebox.defaults.rules, {
    format: {
        validator: function(value, param) {
            var ext = value.substring(value.lastIndexOf('.') + 1);
            return param[0].split(",").includes(ext);
        },
        message: '文件後綴必須為: {0}'
    }
});

$("input[name='fileImage.upload']").validatebox({
    required: true,
    validType: "format['gif,jpg,jpeg,png']"
});

自定義驗證規則 format,僅允許圖片格式,提升用戶體驗與服務器安全。

六、 關鍵配置提醒

  • struts.xml 無需額外配置,文件上傳攔截器默認在 defaultStack 中
  • 上傳文件大小限制:struts.multipart.maxSize=2097152(2MB,可調)
  • 存儲目錄權限:Tomcat 進程需具備寫入權限
  • 生產環境建議:雲存儲對接、圖片壓縮、CDN 分發、惡意文件掃描

組件化封裝讓文件上傳從「業務雜項」變為「基礎設施」,新增上傳需求只需注入 FileUpload 即可復用,體現了單一職責與開閉原則。

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