天天看點

基于SpringMVC的檔案上傳如何實作

基于SpringMVC的檔案上傳

在SpringBoot項目中,上傳的檔案預設不允許超過1M(也可能是其它值,根據SpringBoot的版本不同可能有差異),如果超出,将導緻FileSizeLimitExceededException!如果需要自定義該限制值,需要在配置類中添加:

@Bean
public MultipartConfigElement multipartConfigElement() {
    MultipartConfigFactory factory = new MultipartConfigFactory();
    factory.setMaxFileSize(DataSize.ofMegabytes(4));
    factory.setMaxRequestSize(DataSize.ofMegabytes(4));
    return factory.createMultipartConfig();
}      

注意:在開發項目時,在配置類中需要限制上傳的檔案大小,在控制器類中還要再次進行判斷!因為,在同一個項目,可能有多種業務都涉及上傳操作,例如“上傳頭像”、“上傳商品圖檔”、“上傳商品宣傳視訊”等,每種業務的限制值都應該不同,以上寫在配置類中的限制值是全局化的限制值,也就是說“無論目前項目的哪個業務要上傳檔案,都不允許超過這個值”,是以,在配置類中的限制值一般是所有涉及上傳的業務中的最大限制值,例如50MB,但是,如果每個業務都以50M為基準也是不合理,例如“上傳頭像”就應該限制為更小的值,則應該在控制器中再進行判斷,是以,控制器中的方法都是針對不同的業務的,都應該獨立的再次判斷上傳檔案的大小!同時,還要注意,即使所有處理上傳的控制器中都判斷了檔案大小,全局化的設定也應該是存在的,一方面是SpringBoot項目預設的限制值非常小(SpringMVC項目預設沒有這個限制),另一方面是因為全局化的設定對應的驗證會執行得更早,可以更早的将明顯的錯誤攔截下來!

關于用戶端,如果需要使用異步送出上傳,基于jQuery的$.ajax()處理示例如下:

// 1. 将按鈕的類型改為button,避免點選時按照傳統方式送出表單
// 2. 為按鈕添加id="btn-upload"
// 3. 為表單添加id="form-upload"
// 4. 表單中原有的action / method / enctype都已經不需要了,可以删除
// 5. 上傳檔案的ajax請求必須配置processData:false和contentType:false
$('#btn-upload').click(function () {
    $.ajax({
        url: '/upload',
        type: 'post',
        data: new FormData($('#form-upload')[0]),
        processData: false,
        contentType: false,
        success: function(result) {
            alert(result);
        }
    });
});      

如果需要一次性上傳多個檔案,首先,必須明确需要上傳的多個檔案的數量、定位,如果上傳的多個檔案是數量是固定的,且每個檔案的定位是明确的(例如上傳身份證照片的正面與反面),在設計用戶端時,應該使用多個上傳控件,例如:

<p>請身份證的正面照片:<input type="file" name="image1"></p>

<p>請身份證的反面照片:<input type="file" name="image2"></p>

并且,在伺服器端的控制器中,在處理請求的方法中,使用2個MultipartFile參數接收這2個檔案,例如:

public String upload(MultipartFile image1, MultipartFile image2) {

   // 分别對image1和image2進行檢查并上傳

}

另外,如果上傳的多個檔案的數量并不确定,但各檔案的定位是相同的(例如發朋友圈),可以将上傳控件設定為多選的,例如:

<p>請選擇您要上傳的檔案(選擇檔案時按住Ctrl鍵即可選擇多個檔案):<input type="file" name="images" multiple="multiple"></p>

或者,還可以利用JS技術動态添加上傳控件,這些上傳控件都是單選的,并且使用相同的name屬性即可。

然後,在伺服器端的控制器中,在處理請求的方法的參數清單中,使用MultipartFile[]類型接收這多個檔案即可,例如:

public String upload(MultipartFile[] images) {

   // 周遊參數數組進行處理