1. 程式人生 > >SpringMVC檔案上傳

SpringMVC檔案上傳

  • 情景:當表單上傳檔案的時候,介面卡無法通過引數繫結器儲存multipart/form-data型別的資料,所以SpringMVC需要對multipart型別的資料進行解析
  • 前提:匯入上傳檔案的jar包,供解析器內部使用進行圖片上傳

檔案上傳步驟 

  • form表單支援檔案上傳:enctype="multipart/form-data" method="post"
  • 在springmvc的核心配置檔案中配置multipart型別的檔案解析器
        <!-- *高階功能-配置檔案上傳解析器  -->
	<bean id="multipartResolver" class = "org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 設定上傳檔案的最大尺寸為8MB -->
		<property name="maxUploadSize">
			<value>8388608</value>
		</property>
	</bean>
  • 在tomcat伺服器上新建一個虛擬目錄【對映本地物理目錄】來儲存上傳的檔案(先建立,後eclipse下啟動server測試) 

 

  • 測試:複製一張圖片到存放圖片的資料夾下,使用瀏覽器訪問 
  • 在controller的引數列表新增形參:MultipartFile file,用於繫結multipart檔案型別資料
  • 在controller方法中先判斷file是否為空
  • 然後編寫程式碼為上傳的檔案生成一個新的檔名,然後新增物理路徑生成新的file檔案
  • 將儲存在file中的檔案寫入記憶體中,路徑即為新檔名的全路徑,這樣就將上傳的檔案儲存到了物理路徑下
  • 上傳成功後,最終將新檔名寫入POJO中進行間接繫結,至此引數繫結真正完成!
@RequestMapping(value = "/login",method = {RequestMethod.GET,RequestMethod.POST})
	public ModelAndView Login(Model modle,User user,MultipartFile file) throws Exception{
		ModelAndView modelAndView = new ModelAndView();
		//上傳檔案的原始名稱
		String originalFilename = file.getOriginalFilename();
		//切記要做多次判斷,否則不選擇圖片點選提交會報字串越界的錯誤
		if(file != null && originalFilename != null && originalFilename.length() > 0 ){
			//儲存檔案的物理路徑
			String file_path = "D:\\tomcat_picture\\";
			//生成新的檔名稱(格式:隨機數+原始檔名.後面的副檔名)
			String newFilename = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
			//新檔案
			java.io.File newFile = new java.io.File(file_path+newFilename);
			
			//將記憶體中上傳的檔案資料寫入磁碟,此時上傳的檔案都儲存在了物理目錄下!檔名為新檔案的名字!
			file.transferTo(newFile);
			
			//如果上傳成功,要將新的檔名寫入POJO屬性中進行間接儲存
			//以後對該檔案的訪問和獲取,都將通過新的檔名進行!
			user.setUserFile(newFilename);
			
		}
		modelAndView.setViewName("login");
		return modelAndView;
	}

附錄:

 注意:

  1. 檔案的物理目錄一般分級建立,目的是提高IO效能,一般採用日期進行分級建立
  2. 同樣也要保持JSP頁面<input type = "file" name="file">和形參名file一致
  3. 程式測試沒有問題,如果無法上傳一般情況是建立的虛擬目錄和物理目錄不能對應,返回繼續除錯!
  4. JSP顯示:<img src="/pic/${u.userFile}" width=100 height=100>