SpringMVC使用ResponseEntity實現文件上傳下載
使用 ResponseEntity 實現文件上傳和下載
在 static 下新建一個 img ,並且我放瞭一張圖片在裡面,然後重新 maven 打包一下。
下載
新建一個頁面file.html,並且配置視圖控制器,以便跳轉:
<mvc:view-controller path="/file" view-name="file"></mvc:view-controller>
編寫頁面內容,用來下載我上面存放到 img 中的圖片:
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>測試文件上傳和下載</title> </head> <body> <a th:href="@{/testDown}" rel="external nofollow" >下載靜態圖片</a> </body> </html>
後端編寫對應處理請求的控制,新建一個類 FileUpAndDownController,在下面編寫控制器方法:
@Controller public class FileUpAndDownController { @RequestMapping("/testDown") public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException { //獲取ServletContext對象 ServletContext servletContext = session.getServletContext(); //獲取服務器中文件的真實路徑 String realPath = servletContext.getRealPath("/static/img/ACC3.jpg"); //創建輸入流 InputStream is = new FileInputStream(realPath); //創建字節數組,is.available()是當前流的所有字節數 byte[] bytes = new byte[is.available()]; //將流讀到字節數組中 is.read(bytes); //創建HttpHeaders對象設置響應頭信息 MultiValueMap<String, String> headers = new HttpHeaders(); //設置要下載方式以及下載文件的名字 headers.add("Content-Disposition", "attachment;filename=ACC3.jpg"); //設置響應狀態碼 HttpStatus statusCode = HttpStatus.OK; //創建ResponseEntity對象 ResponseEntity<byte[]> responseEntity = new ResponseEntity<byte[]>(bytes, headers, statusCode); //關閉輸入流 is.close(); return responseEntity; } }
文件不管是上傳還是下載,本質還是一個復制的過程。
既然要復制,那還是要先讀後寫,所以上面創建瞭輸入流,將流讀到字節數組中,然後把這個字節數組響應到瀏覽器,這就是要下載的文件瞭。
所以,用到瞭 ResponseEntity,要把響應到瀏覽器的數據轉化成 ResponseEntity,最後返回。
重新部署測試一下,訪問 file 頁面,點擊下載超鏈接。
下載成功。
上傳
在前端頁面 file.html 中繼續添加內容:
<form th:action="@{/testUp}" method="post" enctype="multipart/form-data"> 頭像:<input type="file" name="photo"><br> <input type="submit" value="上傳"> </form>
文件上傳要求 form 表單的請求方式必須為 post,並且添加屬性 enctype="multipart/form-data"。
添加依賴:
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency>
SpringMVC 中將上傳的文件封裝到MultipartFile對象中,通過此對象可以獲取文件相關信息。
在 springMVC 的配置文件中添加配置:
<!--必須通過文件解析器的解析才能將文件轉換為MultipartFile對象--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
增加控制器方法,實現上傳:
@RequestMapping("/testUp") public String testUp(MultipartFile photo, HttpSession session) throws IOException { //獲取上傳的文件的文件名 String fileName = photo.getOriginalFilename(); //處理文件重名問題 String hzName = fileName.substring(fileName.lastIndexOf(".")); fileName = UUID.randomUUID().toString() + hzName; //獲取服務器中 photo目錄的路徑 ServletContext servletContext = session.getServletContext(); String photoPath = servletContext.getRealPath("photo"); File file = new File(photoPath); if(!file.exists()){ file.mkdir(); // 不存在則創建目錄 } String finalPath = photoPath + File.separator + fileName; //實現上傳功能 photo.transferTo(new File(finalPath)); return "success"; }
註意,我們最終上傳的位置是在這裡,會自動創建一個 photo 目錄,裡面存放著上傳的圖片。
部署測試一下。
上傳請求處理成功,跳轉到瞭 success 頁。
再來看下目標位置,已經有瞭上傳過來的圖片瞭。
以上就是SpringMVC使用ResponseEntity實現文件上傳下載的詳細內容,更多關於SpringMVC文件上傳下載的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- SpringMVC實現文件上傳與下載、攔截器、異常處理器等功能
- SpringMVC實現文件上傳下載的全過程
- springmvc實現文件上傳功能
- spring boot實現文件上傳
- springmvc中下載中文文件名稱為下劃線的解決方案