1. 程式人生 > >spring實戰-Spring檔案上傳MultipartFile

spring實戰-Spring檔案上傳MultipartFile

第六篇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

<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>
4,處理控制器,接受並處理MultipartFile

/**
	 * 直接接受物件型別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";
	}

至此,我們便完成了從客戶端向伺服器上傳提交檔案