前兩天做項目用到了Springmvc的文件上傳來上傳圖片,由於和這個普通的Java文件上傳處理流程不太一樣,所以做的時候碰了壁,一頓百度,博客,要不就是一部分代碼,要不就是看不懂,用不會的代碼,
下面來放上我理解到的,代碼量還可以。歡迎批評改正
1.需要的炸包兒
commons-io-1.3.2.jar
commons-lang-2.6.jar
commons-fileupload-1.2.1.jar
2.定義springmvc配置文件的上傳文件的bean:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"></property>
<!--上傳文件最大值,單位byte-->
<property name="maxUploadSize" value="104857600"></property>
</bean>
3.前台必須的form表單,post提交,enctype="multipart/form-data",表單框框name還是實體類字段
注意:file文件域的name值不能和實體類相同,因為controller要使用@RequestParam(value = "up_file", required = false) MultipartFile multipartFile單獨接收 明顯能看出前台file文件域的name屬性要是和實體類屬性名不可能封裝到一起,所以單拎出來使用MultipartFile 接收。
4.Controller里定義一個變量接收file的文件名賦值給實體類然后傳給數據庫
//准備變量放入實體類 放入數據庫
String filename = null;
5.使用isEmpty判斷剛才接收的file文件是否為空 if (!multipartFile.isEmpty())
6.准備上傳工作,
//1.定義上傳的目標路徑"static" + File.separator + "upload" 靜態資源文件夾 分隔符 存放img的文件夾 String path = request.getSession().getServletContext().getRealPath("static" + File.separator + "ProductImg"); //2.獲取源文件名 String oldFileName = multipartFile.getOriginalFilename(); //3.獲取源文件的后綴 FilenameUtils工具類的getExtension方法 String suffix = FilenameUtils.getExtension(oldFileName); //4.獲取源文件的大小 long size = multipartFile.getSize();
7.判斷上傳的文件是否大於配置文件里定義的大小和定義及判斷文件后綴名
if (size > 454000) { request.setAttribute("uploadFileError", "上傳文件大小不能超過500kb"); return "ProductAdd"; }else if (suffix.equalsIgnoreCase("jpg") ||
suffix.equalsIgnoreCase("png") || //判斷 這些是符合要求的圖片格式
suffix.equalsIgnoreCase("jpeg") ||
suffix.equalsIgnoreCase("pneg"))
8.防止用戶上傳的圖片文件名一樣,處理文件名:
String NewFileName = System.currentTimeMillis() + RandomUtils.nextInt(100000) + "." + suffix;
9.開始上傳:
File targetFile = new File(path, NewFileName); if (!targetFile.exists()) { targetFile.mkdirs(); //判斷這個文件是否存在 } //寫入 上傳 try { multipartFile.transferTo(targetFile); } catch (IOException e) { e.printStackTrace(); request.setAttribute("uploadFileError", "上傳失敗了! 哦,謝特~"); return "ProductAdd"; } filename = NewFileName; //將處理好的上傳的文件的名字傳入變量存進數據庫 } else { //大小可以 格式不符合 request.setAttribute("uploadFileError", "上傳文件的格式不正確"); return "ProductAdd"; } }
10.將一開始定義的存放文件名的變量的值賦值給實體類:
xx.setFileName(filename);
11.處理你form表單的其他字段的信息調用業務方法增刪改,然后返回view
最注意的一點:前台file文件域的name屬性值 不能和實體類名一致
整體代碼:
@RequestMapping(value = "FileAdd", produces = {"text/html;charset=UTF-8;"}) public String AddPRo(ProDuct product, @RequestParam(value = "up_file", required = false) MultipartFile multipartFile, HttpServletRequest request) { //准備變量放入實體類 放入數據庫 String filename = null; /*上傳文件*/ if (!multipartFile.isEmpty()) { //四步准備 //1.定義上傳的目標路徑"static" + File.separator + "upload" String path = request.getSession().getServletContext().getRealPath("static" + File.separator + "ProductImg"); //2.獲取源文件名 String oldFileName = multipartFile.getOriginalFilename(); //3.獲取源文件的后綴 FilenameUtils工具類的getExtension方法 String suffix = FilenameUtils.getExtension(oldFileName); //4.獲取源文件的大小 long size = multipartFile.getSize(); if (size > 454000) { request.setAttribute("uploadFileError", "上傳文件大小不能超過500kb"); return "ProductAdd"; } else if (suffix.equalsIgnoreCase("jpg") || suffix.equalsIgnoreCase("png") || //判斷 這些是符合要求的圖片格式 suffix.equalsIgnoreCase("jpeg") || suffix.equalsIgnoreCase("pneg")) { //定義上傳的文件名 String NewFileName = System.currentTimeMillis() + RandomUtils.nextInt(100000) + "." + suffix; //將即將上傳的文件定義 File targetFile = new File(path, NewFileName); if (!targetFile.exists()) { targetFile.mkdirs(); //判斷這個文件是否存在 } //寫入 上傳 try { multipartFile.transferTo(targetFile); } catch (IOException e) { e.printStackTrace(); request.setAttribute("uploadFileError", "上傳失敗了! 哦,謝特~"); return "ProductAdd"; } filename = NewFileName; //將處理好的上傳的文件的名字傳入變量存進數據庫 } else { //大小可以 格式不符合 request.setAttribute("uploadFileError", "上傳文件的格式不正確"); return "ProductAdd"; } } product.setFilename(filename); if (productService.addProduct(product)) { request.setAttribute("ProList", "Ok"); return "redirect:product/ProAdd"; //* return map.put("OkShowProduct", ProDuct);*//* } else { request.setAttribute("ProList", "No"); return "redirect:product/ProAdd"; } }