spring實戰-Spring檔案上傳MultipartFile
阿新 • • 發佈:2018-11-04
第六篇:spring實戰-Spring檔案上傳MultipartFile
在構建網站是,處理檔案上傳功能是必須的,比如建立使用者需要使用者上傳頭像,建立伺服器列表需要上傳Excel檔案等等
在Springmvc中對檔案上傳做了比較好的支援,同時支援基於Servlet3.0的標準multipart請求(StandardServletMultipartResolver),也支援基於Jakarta的Commons FileUpload(CommonsMultipartResolver)
下面主要展示標準Servlet3.0支援的方式,也推薦這種方式
1,需要在TilesWebConfig中配置MultipartResolver
/**
* 使用以來servet3.0的標準multipart解析器
* @return
*/
@Bean
public MultipartResolver multipartResolver() {
return new StandardServletMultipartResolver();
}
2,需要在IdatWebAppInitializer中配置MultipartConfigElement
/** * 設定Servlet支援檔案上傳 * 並且上傳的檔案儲存臨時路徑在/tmp/idat/uploads路徑下面 * 單個檔案大小不超過2M,一次上傳所有檔案大小總和不超過4M,0表示檔案個數不限 * 如果檔案大小超過限制,則會儲存到臨時路徑下 */ @Override protected void customizeRegistration(Dynamic registration) { registration.setMultipartConfig(new MultipartConfigElement("d:/idat/uploads",2097152,4194304,0)); super.customizeRegistration(registration); }
3,檔案上傳表單form支援multipart/form-data
4,處理控制器,接受並處理MultipartFile<form:form method="POST" commandName="interface" enctype="multipart/form-data"> <form:errors path="*" element="div" cssClass="errors"></form:errors> <table> ....... <tr> <td>logo</td> <td><input type="file" name="logo" /></td> </tr> </table> <input type="submit" value="create" /> </form:form>
/**
* 直接接受物件型別Interface 作為入參
* form表單中input的屬性name和Interface的屬性一一對應
* 註解@Valid啟用校驗功能,會按著Interface中屬性的校驗規則來校驗入參
* 需要住的是後面的Errors引數需要緊跟@Valid註解的變數後面,error返回該校驗引數的校驗結果
* 但是如果希望Valid生效,還需要hibernate-validator包,或者同類實現Java Validation API的包
* @param intf
* @return
* @throws FileNotFoundException
*/
@RequestMapping(value = "/create", method=RequestMethod.POST)
public String create(@Valid Interface intf, Errors errors, @RequestPart("logo") MultipartFile logo) throws IOException{
// 如果校驗不通過的話,返回建立表單頁面
if (errors.hasErrors()) {
return "createForm";
}
String originalFilename = logo.getOriginalFilename();
FileOutputStream fileOutputStream = new FileOutputStream("d:/idat/"+originalFilename);
fileOutputStream.write(logo.getBytes());
fileOutputStream.flush();
fileOutputStream.close();
Interface rintf = idatService.save(intf);
// 當檢視解析器遇到 redirect:時,把他解析為重定向的規則,還有一個forward:
// 具體redirect 和 forward 的區別 請參考 http://blog.csdn.net/tidu2chengfo/article/category/6993805
return "redirect:queryInterfacesByName/" + rintf.getName() + "/intf";
}
至此,我們便完成了從客戶端向伺服器上傳提交檔案