前兩天做專案用到了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"; } }