springmvc實現檔案上傳和下載
阿新 • • 發佈:2019-01-29
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;
}