1. 程式人生 > >springmvc實現檔案上傳和下載

springmvc實現檔案上傳和下載

springmvc實現檔案上傳的步驟:

1.頁面上,通過input來準備file元件,該標籤,必須給定name屬性值(該name不能和實體類的屬性名一致)
同時,要求form表單必須給定一個屬性:enctype="multipart/form-data"

<form action="uc/adduser" method="post" enctype="multipart/form-data">
		<p>
			使用者名稱:<input type="text" name="loginname" id="loginname" />
		</p>
		<p>
			密碼:<input type="text" name="loginpwd" id="loginpwd" />
		</p>


		<p>
			頭像:<input type="file" name="pic" id="pic" />
		</p>


		<p>
			<input type="submit" value="註冊" />
		</p>


	</form>




2.在pom.xml檔案中,新增檔案上傳的第三方工具:
commons-fileupload-1.3.2.jar
commons-io-2.2.jar

	<!-- 檔案上傳依賴(該依賴下載時,commons-io-2.2.jar也隨著新增到依賴中) -->
		<dependency>
		    <groupId>commons-fileupload</groupId>
		    <artifactId>commons-fileupload</artifactId>
		    <version>1.3.2</version>
		</dependency>



3.在app-springmvc.xml配置檔案中,準備上傳操作的物件:CommonsMultipartResolver
在這個物件中,我們可以對檔案大小,編碼方式等進行設定

<!-- 圖片上傳 -->
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!--每個檔案上傳大小-->
		<property name="maxUploadSizePerFile" value="102400000"></property>
	</bean>



4.在控制器中,通過@RequestParam MultipartFile pic這種方式,來接收頁面傳遞的檔案,這裡,引數的名字必須與頁面上file元件的name屬性值一致
此時,在控制器中,已經能夠正常地接收頁面上傳的檔案了,下一步,只需要把接收的這個檔案,儲存到伺服器的硬碟上即可(在專案根目錄下建立一個upload資料夾儲存上傳的檔案)

控制器程式碼:

@RequestMapping(value = "adduser", method = RequestMethod.POST)
	public String addUser(Users users,
			@RequestParam MultipartFile pic, HttpServletRequest request,
			Model model) {

		// 原始上傳檔名字
		String filename = pic.getOriginalFilename();
		// 檔案型別
		String contentType = pic.getContentType();

		InputStream is = null;
		OutputStream os = null;
		// 上傳目錄的絕對路徑
		String realpath = request.getSession().getServletContext()
				.getRealPath("/upload");
		// 得到一個隨機的字串作為上傳檔案的新名字(防止檔案因名字相同而覆蓋)
		String uuid = UUID.randomUUID().toString();
		// 獲得檔案的字尾名
		String endname = filename.substring(filename.lastIndexOf("."),
				filename.length());

		// 要把檔案輸出到硬碟上有兩種方式
		// 方式一:自己寫位元組流 並通過邊讀邊寫操作完成輸出
		// try {
		// is = pic.getInputStream();
		// os = new FileOutputStream(new File(realpath + "/" + uuid + endname));
		// byte[] b = new byte[1024];
		// int len = is.read(b);
		// while (len != -1) {
		// os.write(b, 0, len);
		// len = is.read(b);
		// }
		// } catch (IOException e1) {
		// e1.printStackTrace();
		// } finally {
		// try {
		// os.flush();
		// os.close();
		// is.close();
		// } catch (IOException e) {
		// e.printStackTrace();
		// }
		// }

		// 方式二、通過commons-io包提供的工具來完成拷貝
		try {
			is = pic.getInputStream();
			os = new FileOutputStream(new File(realpath + "/" + uuid + endname));
			FileCopyUtils.copy(is, os);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				os.flush();
				os.close();
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		// 上傳完成後,還需要把檔案路徑和名字儲存到user物件中,然後把user物件的資訊,儲存到資料庫中
		// 下次能夠根據資料庫的記錄,來找到對應的檔案
		users.setPicpath(uuid + endname);
		boolean flag = userServiceImpl.addUser(users);
		if (flag) {
			model.addAttribute("mypic", uuid + endname);
			return "add_suc";
		}
		return "index";
	}


SpringMVC 檔案下載核心程式碼:

頁面中將需要下載的檔案的名字引數傳輸到控制器中,在控制器中的程式碼如下(檔案儲存在專案根目錄的upload資料夾裡面):

/**
	 * 實現下載的步驟: 1、需要把資料以流的形式響應到頁面 2、需要在頁面上開啟Content-disposition=attachment
	 * 
	 * @return
	 */
	@RequestMapping(value = "downloadfile")
	public ResponseEntity<byte[]> downloadFile(String mypicname,
			HttpServletRequest request) {
		// 讀取檔案儲存的根位置
		String realPath = request.getSession().getServletContext()
				.getRealPath("/upload");
		File file = new File(realPath + "/" + mypicname);
		HttpHeaders header = new HttpHeaders();
		header.setContentDispositionFormData("attachment", mypicname);
		ResponseEntity<byte[]> re = null;
		try {
			re = new ResponseEntity<byte[]>(
					FileUtils.readFileToByteArray(file), header, HttpStatus.OK);
		} catch (IOException e) {
			e.printStackTrace();
		}

		return re;

	}