SpringMVC使用ResponseEntity實(shí)現(xiàn)文件上傳下載
使用 ResponseEntity 實(shí)現(xiàn)文件上傳和下載
在 static 下新建一個(gè) img ,并且我放了一張圖片在里面,然后重新 maven 打包一下。
下載
新建一個(gè)頁(yè)面file.html,并且配置視圖控制器,以便跳轉(zhuǎn):
<mvc:view-controller path="/file" view-name="file"></mvc:view-controller>
編寫頁(yè)面內(nèi)容,用來(lái)下載我上面存放到 img 中的圖片:
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>測(cè)試文件上傳和下載</title> </head> <body> <a th:href="@{/testDown}" rel="external nofollow" >下載靜態(tài)圖片</a> </body> </html>
后端編寫對(duì)應(yīng)處理請(qǐng)求的控制,新建一個(gè)類 FileUpAndDownController,在下面編寫控制器方法:
@Controller public class FileUpAndDownController { @RequestMapping("/testDown") public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException { //獲取ServletContext對(duì)象 ServletContext servletContext = session.getServletContext(); //獲取服務(wù)器中文件的真實(shí)路徑 String realPath = servletContext.getRealPath("/static/img/ACC3.jpg"); //創(chuàng)建輸入流 InputStream is = new FileInputStream(realPath); //創(chuàng)建字節(jié)數(shù)組,is.available()是當(dāng)前流的所有字節(jié)數(shù) byte[] bytes = new byte[is.available()]; //將流讀到字節(jié)數(shù)組中 is.read(bytes); //創(chuàng)建HttpHeaders對(duì)象設(shè)置響應(yīng)頭信息 MultiValueMap<String, String> headers = new HttpHeaders(); //設(shè)置要下載方式以及下載文件的名字 headers.add("Content-Disposition", "attachment;filename=ACC3.jpg"); //設(shè)置響應(yīng)狀態(tài)碼 HttpStatus statusCode = HttpStatus.OK; //創(chuàng)建ResponseEntity對(duì)象 ResponseEntity<byte[]> responseEntity = new ResponseEntity<byte[]>(bytes, headers, statusCode); //關(guān)閉輸入流 is.close(); return responseEntity; } }
文件不管是上傳還是下載,本質(zhì)還是一個(gè)復(fù)制的過(guò)程。
既然要復(fù)制,那還是要先讀后寫,所以上面創(chuàng)建了輸入流,將流讀到字節(jié)數(shù)組中,然后把這個(gè)字節(jié)數(shù)組響應(yīng)到瀏覽器,這就是要下載的文件了。
所以,用到了 ResponseEntity,要把響應(yīng)到瀏覽器的數(shù)據(jù)轉(zhuǎn)化成 ResponseEntity,最后返回。
重新部署測(cè)試一下,訪問(wèn) file 頁(yè)面,點(diǎn)擊下載超鏈接。
下載成功。
上傳
在前端頁(yè)面 file.html 中繼續(xù)添加內(nèi)容:
<form th:action="@{/testUp}" method="post" enctype="multipart/form-data"> 頭像:<input type="file" name="photo"><br> <input type="submit" value="上傳"> </form>
文件上傳要求 form 表單的請(qǐng)求方式必須為 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對(duì)象中,通過(guò)此對(duì)象可以獲取文件相關(guān)信息。
在 springMVC 的配置文件中添加配置:
<!--必須通過(guò)文件解析器的解析才能將文件轉(zhuǎn)換為MultipartFile對(duì)象--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
增加控制器方法,實(shí)現(xiàn)上傳:
@RequestMapping("/testUp") public String testUp(MultipartFile photo, HttpSession session) throws IOException { //獲取上傳的文件的文件名 String fileName = photo.getOriginalFilename(); //處理文件重名問(wèn)題 String hzName = fileName.substring(fileName.lastIndexOf(".")); fileName = UUID.randomUUID().toString() + hzName; //獲取服務(wù)器中 photo目錄的路徑 ServletContext servletContext = session.getServletContext(); String photoPath = servletContext.getRealPath("photo"); File file = new File(photoPath); if(!file.exists()){ file.mkdir(); // 不存在則創(chuàng)建目錄 } String finalPath = photoPath + File.separator + fileName; //實(shí)現(xiàn)上傳功能 photo.transferTo(new File(finalPath)); return "success"; }
注意,我們最終上傳的位置是在這里,會(huì)自動(dòng)創(chuàng)建一個(gè) photo 目錄,里面存放著上傳的圖片。
部署測(cè)試一下。
上傳請(qǐng)求處理成功,跳轉(zhuǎn)到了 success 頁(yè)。
再來(lái)看下目標(biāo)位置,已經(jīng)有了上傳過(guò)來(lái)的圖片了。
以上就是SpringMVC使用ResponseEntity實(shí)現(xiàn)文件上傳下載的詳細(xì)內(nèi)容,更多關(guān)于SpringMVC文件上傳下載的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 解決springboot responseentity<string>亂碼問(wèn)題
- 使用ResponseEntity作為的返回值的應(yīng)用
- 常用的ResponseEntity.BodyBuilder和自定義ResponseEntity的實(shí)例
- springmvc @ResponseStatus和ResponseEntity的使用
- SpringMVC返回的ResponseEntity出現(xiàn)亂碼及解決
- 使用spring框架ResponseEntity實(shí)現(xiàn)文件下載
- 如何使用spring ResponseEntity處理http響應(yīng)
- 使用ResponseEntity處理API返回問(wèn)題
相關(guān)文章
如何用JAVA判斷當(dāng)前時(shí)間是否為節(jié)假日、周末、工作日及調(diào)休日(不報(bào)錯(cuò):IOException!)
最近公司有個(gè)業(yè)務(wù)需要判斷工作日,但是每年的節(jié)假日不一樣,下面這篇文章主要給大家介紹了關(guān)于如何用JAVA判斷當(dāng)前時(shí)間是否為節(jié)假日、周末、工作日及調(diào)休日的相關(guān)資料,且不報(bào)錯(cuò):IOException!,需要的朋友可以參考下2023-12-12Mybatis?如何開啟控制臺(tái)打印sql語(yǔ)句
這篇文章主要介紹了Mybatis?如何開啟控制臺(tái)打印sql語(yǔ)句問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11親身體驗(yàn)Intellij?Idea從卡頓到順暢全過(guò)程
這篇文章主要介紹了親身體驗(yàn)Intellij?Idea從卡頓到順暢全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09Apache Shrio安全框架實(shí)現(xiàn)原理及實(shí)例詳解
這篇文章主要介紹了Apache Shrio安全框架實(shí)現(xiàn)原理及實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Java實(shí)戰(zhàn)之客戶信息管理系統(tǒng)
這篇文章主要介紹了Java實(shí)戰(zhàn)之客戶信息管理系統(tǒng),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04Java編程用兩個(gè)棧實(shí)現(xiàn)隊(duì)列代碼分享
這篇文章主要介紹了Java編程用兩個(gè)棧實(shí)現(xiàn)隊(duì)列代碼分享,具有一定參考價(jià)值,這里給大家分享下,供需要的朋友了解。2017-10-10