您好,登錄后才能下訂單哦!
前言
我們在實(shí)際開發(fā)過程中,尤其是web項(xiàng)目開發(fā),文件上傳和下載的需求的功能非常場景,比如說用戶頭像、商品圖片、郵件附件等等。其實(shí)文件上傳下載的本質(zhì)都是通過流的形式進(jìn)行讀寫操作,而在開發(fā)中不同的框架都會對文件上傳和下載有或多或少的封裝,這里就以Spring MVC環(huán)境中文件的上傳為例,講解Spirng MVC環(huán)境下的文件上傳功能實(shí)現(xiàn)。下面話不多說了,來一起看看詳細(xì)的介紹吧。
一、客戶端編程
由于多數(shù)文件上傳都是通過表單形式提交給后臺服務(wù)器的,因此,要實(shí)現(xiàn)文件上傳功能,就需要提供一個(gè)文件上傳的表單。同時(shí)該表單必須滿足以下3個(gè)條件:
multipart/form-data
;<input type="file" name="fileName" />
的文件上傳輸入框。在HTML5之前,如果想要上傳多個(gè)文件,必須使用多個(gè)<input>元素。但是在HTML5中,在<input>元素配置multiple屬性即可進(jìn)行多個(gè)文件的上傳。在HTML5中編寫以下任意一行代碼,便可生成一個(gè)按鈕供選擇多個(gè)文件:
<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>
二、springmvc-config.xml配置文件配置
當(dāng)客戶端form表單的enctype屬性為multipart/form-data
時(shí),瀏覽器就會采用二進(jìn)制流的方式來處理表單數(shù)據(jù),而對于文件上傳的處理則涉及在服務(wù)器端解析原始的HTTP請求。Spring MVC為文件上傳提供了直接的支持,這種支持是用即插即用的MultipartResolver實(shí)現(xiàn)的。
在Sring MVC中使用MultipartResolver也非常簡單,只需要在Spring MVC配置文件springmvc-config.xml中定義MultipartResolver接口實(shí)現(xiàn)類即可,示例如下:
<!-- 配置文件上傳類型解析器 multipartResolver--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 設(shè)置上傳文件最大尺寸,單位為B --> <property name="maxUploadSize" value="5242880" /> </bean>
注意:
由于MultipartResolver實(shí)現(xiàn)類CommonsMultipartResolver內(nèi)部是引用multipartResolver字符串獲取該實(shí)現(xiàn)類對象并完成文件上傳操作的,所以在配置CommonsMultipartResolver時(shí)必須指定該bean的id為multipartResolver。另外由于MultipartResolver實(shí)現(xiàn)類CommonsMultipartResolver是Spring MVC內(nèi)部通過Apache Commons FileUpload技術(shù)實(shí)現(xiàn)的。因此Spirng MVC的文件上傳還需要依賴Apache Commons FileUpload的組件,即需要導(dǎo)入支持文件上傳和下載的JAR包,具體如下:
三、后臺文件下載實(shí)現(xiàn)(MultipartFile接口介紹)
當(dāng)完成上述客戶端代碼的編寫及文件上傳組件的配置后,在Spring MVC中處理已經(jīng)上傳的文件就十分容易了,上傳到Spring MVC程序中的文件會被封裝到一個(gè)MultipartFile對象中,然后開發(fā)者通過該對象的方法就可以進(jìn)行后續(xù)相關(guān)處理了。
編寫后臺文件上傳控制器類及方法,具體示例如下:
/** * 向文件上傳頁面跳轉(zhuǎn) */ @RequestMapping("/toFileUpload") public String toFileUpload( ){ return "fileUpload"; } /** * 接收文件上傳請求 */ @RequestMapping("/fileUpload") public String fileUpload(List<MultipartFile> images){ //對上傳圖像進(jìn)行解析操作 if(images !=null && images.size()>0){ for (MultipartFile image : images) { //獲取上傳文件的原始名稱 String originalFilename = image.getOriginalFilename(); //設(shè)置上傳文件的保存地址目錄 String dirPath="D:\\fileUpload\\"; File file =new File(dirPath); //如果保存文件的地址不存在,就先創(chuàng)建目錄 if(!file.exists()){ file.mkdirs(); } //使用UUID重新命名上傳的文件名稱(看公司需求,也可以用日期時(shí)間) String newFilename= UUID.randomUUID()+originalFilename.substring(originalFilename.lastIndexOf(".")); try { //使用MultipartFile接口的方法完成文件上傳到指定位置 image.transferTo(new File(dirPath+newFilename)); //文件上傳成功后,需要將文件存放路徑存入數(shù)據(jù)庫中 //TODO,省略 } catch (Exception e) { e.printStackTrace(); //當(dāng)文件上傳出現(xiàn)異常,則重定向到文件上傳頁面 return "redirect:toFileUpload"; } } } //文件上傳成功后,跳轉(zhuǎn)到成功頁面 return "success"; }
四、效果演示(讀者可以自己編寫項(xiàng)目和jsp頁面)
部署并啟動web服務(wù)器,在瀏覽器地址啦輸入地址:http://localhost:8080/webname/toFileUpload后(讀者根據(jù)自己的項(xiàng)目和路徑進(jìn)行訪問),瀏覽器的顯示效果如下圖所示。
上面我選擇了上傳2個(gè)文件,然后點(diǎn)擊提交后,即可完成上傳。讀者操作后可自行到指定上傳位置進(jìn)行驗(yàn)證。
至此,Sring MVC環(huán)境下文件上傳功能代碼即已實(shí)現(xiàn)。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。