Spring MVC環境中的文件上傳功能實現

     在實際開發過程當中,尤爲是web項目開發,文件上傳和下載的需求的功能很是場景,好比說用戶頭像、商品圖片、郵件附件等等。其實文件上傳下載的本質都是經過流的形式進行讀寫操做,而在開發中不一樣的框架都會對文件上傳和下載有或多或少的封裝,這裏就以Spring MVC環境中文件的上傳爲例,講解Spirng MVC環境下的文件上傳功能實現。web

1、客戶端編程spring

      因爲多數文件上傳都是經過表單形式提交給後臺服務器的,所以,要實現文件上傳功能,就須要提供一個文件上傳的表單。同時該表單必須知足如下3個條件:數據庫

  • form表單的method屬性設置爲post;
  • form表單的enctype屬性設置爲multipart/form-data;
  • 提供<input type="file" name="fileName" />的文件上傳輸入框。

在HTML5以前,若是想要上傳多個文件,必須使用多個<input>元素。可是在HTML5中,在<input>元素配置multiple屬性便可進行多個文件的上傳。在HTML5中編寫如下任意一行代碼,即可生成一個按鈕供選擇多個文件:編程

  • <input type="file" name="fileName" multiple />
  • <input type="file" name="images" multiple="multiple" />
  • <input type="file" name="images" multiple="" />

具體代碼示例以下:瀏覽器

<form action="uploadUrl" method="post" enctype="multipart/form-data">
    <input type="file" name="images" multiple="multiple" />
    <input type="submit" value="文件上傳" />
</form>

2、springmvc-config.xml配置文件配置服務器

      當客戶端form表單的enctype屬性爲multipart/form-data時,瀏覽器就會採用二進制流的方式來處理表單數據,而對於文件上傳的處理則涉及在服務器端解析原始的HTTP請求。Spring MVC爲文件上傳提供了直接的支持,這種支持是用即插即用的MultipartResolver實現的。mvc

在Sring MVC中使用MultipartResolver也很是簡單,只須要在Spring MVC配置文件springmvc-config.xml中定義MultipartResolver接口實現類便可,示例以下:app

<!-- 配置文件上傳類型解析器 multipartResolver-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 設置上傳文件最大尺寸,單位爲B -->
    <property name="maxUploadSize" value="5242880" />
</bean>

    注意:框架

因爲MultipartResolver實現類CommonsMultipartResolver內部是引用multipartResolver字符串獲取該實現類對象並完成文件上傳操做的,因此在配置CommonsMultipartResolver時必須指定該bean的id爲multipartResolver。另外因爲MultipartResolver實現類CommonsMultipartResolver是Spring MVC內部經過Apache Commons FileUpload技術實現的。所以Spirng MVC的文件上傳還須要依賴Apache Commons FileUpload的組件,即須要導入支持文件上傳和下載的JAR包,具體以下:dom

  •  commons-fileupload.jar
  •  commons-io.jar

3、後臺文件下載實現(MultipartFile接口介紹)

當完成上述客戶端代碼的編寫及文件上傳組件的配置後,在Spring MVC中處理已經上傳的文件就十分容易了,上傳到Spring MVC程序中的文件會被封裝到一個MultipartFile對象中,而後開發者經過該對象的方法就能夠進行後續相關處理了。

 編寫後臺文件上傳控制器類及方法,具體示例以下:

/**
 * 向文件上傳頁面跳轉
 */
@RequestMapping("/toFileUpload")
public String toFileUpload( ){
    return "fileUpload";
}
/**
 * 接收文件上傳請求
 */
@RequestMapping("/fileUpload")
public String fileUpload(List<MultipartFile> images){
    //對上傳圖像進行解析操做
    if(images !=null && images.size()>0){
        for (MultipartFile image : images) {
            //獲取上傳文件的原始名稱
            String originalFilename = image.getOriginalFilename();
            //設置上傳文件的保存地址目錄
            String dirPath="D:\\fileUpload\\";
            File file =new File(dirPath);
            //若是保存文件的地址不存在,就先建立目錄
            if(!file.exists()){
                file.mkdirs();
            }
            //使用UUID從新命名上傳的文件名稱(看公司需求,也能夠用日期時間)
            String newFilename= UUID.randomUUID()+originalFilename.substring(originalFilename.lastIndexOf("."));
            try {
                //使用MultipartFile接口的方法完成文件上傳到指定位置
                image.transferTo(new File(dirPath+newFilename));
                //文件上傳成功後,須要將文件存放路徑存入數據庫中
                //TODO,省略
            } catch (Exception e) {
                e.printStackTrace();
                //當文件上傳出現異常,則重定向到文件上傳頁面
                return "redirect:toFileUpload";
            } 
        }
    }
    //文件上傳成功後,跳轉到成功頁面
    return "success";
}

4、效果演示(讀者能夠本身編寫項目和jsp頁面)

    部署並啓動web服務器,在瀏覽器地址啦輸入地址:http://localhost:8080/webname/toFileUpload後(讀者根據本身的項目和路徑進行訪問),瀏覽器的顯示效果以下圖所示

   上面我選擇了上傳2個文件,而後點擊提交後,便可完成上傳。讀者操做後可自行到指定上傳位置進行驗證。

   至此,Sring MVC環境下文件上傳功能代碼即已實現。

相關文章
相關標籤/搜索