一、導入相關依賴 <dependencies> <!--文件上傳--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</versi ...
一、導入相關依賴
<dependencies> <!--文件上傳--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> </dependencies>
實際上我們需要的包有commons-fileupload和commons-io,但我們使用Maven時導入commons-fileupload包,Maven會自動幫我們導入它的依賴包commons-io。
二、前端建立一個文件上傳的表單
<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data"> <input type="file" accept="image/*" name="file"/> <input type="submit" value="上傳文件"/> </form>
enctype時設置被提交數據的編碼,enctype="multipart/form-data"是設置文件以二進位數據發送給伺服器。
<input type="file" accept="image/*"> type="file"說明是要選擇文件進行上傳,accept="image/*"表示上傳文件的MIME類型,這裡表示的是各種類型的圖片文件。
三、SpringMVC中配置MultipartResolver
SpringMVC能夠支持文件上傳的操作,但是需要在上下文中對MultipartResolver進行配置,具體配置如下:
<!--文件上傳--> <bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver"> <!--請求的編碼格式,預設為ISO-8859-1--> <property name="defaultEncoding" value="utf-8"/> <!-- 上傳文件大小上限,單位為位元組(byte),這裡是10M和40K 第二個其實是一個閾值,小於此值文件會存在記憶體中,大於此值文件會存在磁碟上,所以理解成上傳文件的最小上限沒有問題 --> <property name="maxUploadSize" value="10485760"/> <property name="maxInMemorySize" value="40960"/> </bean>
四、編寫文件上傳的controller,這裡有兩種上傳方法
方法一:
@RequestMapping("/upload") @ResponseBody public String fileUpload(@RequestParam("file") CommonsMultipartFile file , HttpServletRequest request) throws IOException { //上傳的文件名 String uploadFileName = file.getOriginalFilename(); //判斷文件名是否為空 if ("".equals(uploadFileName)){ return null; } //上傳路徑保存設置 String path = request.getServletContext().getRealPath("/upload"); //如果路徑不存在,創建一個 File realPath = new File(path); if (!realPath.exists()){ realPath.mkdir(); } InputStream is = file.getInputStream(); //文件輸入流 OutputStream os = new FileOutputStream(new File(realPath,uploadFileName)); //文件輸出流 //讀取寫出 int len=0; byte[] buffer = new byte[1024]; while ((len=is.read(buffer))!=-1){ os.write(buffer,0,len); os.flush(); } os.close(); is.close(); return "/upload/" + uploadFileName; }
方法二:
@RequestMapping("/upload2") @ResponseBody public String fileUpload2(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException { //上傳路徑保存設置 String path = request.getServletContext().getRealPath("/upload"); File realPath = new File(path); if (!realPath.exists()){ realPath.mkdir(); } //上傳的文件名 String uploadFileName = file.getOriginalFilename(); //通過CommonsMultipartFile的方法直接寫文件( file.transferTo(new File(realPath +"/"+ uploadFileName)); return "/upload/" + uploadFileName; }
註意: 這裡如果上傳路徑保存設置是多級目錄,就需要用File.mkdirs()。
(本文僅作個人學習記錄用,如有紕漏敬請指正)