精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

讓我們捋一捋上傳和下載

開發 前端
當form表單的enctype屬性為multipart/form-data時,瀏覽器就會采用二進制流來處理表單數據,服務器端就會對文件上傳的請求進行解析處理。

[[433275]]

GitHub:https://github.com/nateshao/ssm/tree/master/111-springmvc-file-upload

1. 文件上傳

文件上傳概述

“多數文件上傳都是通過表單形式提交給后臺服務器的,因此,要實現文件上傳功能,就需要提供一個文件上傳的表單,而該表單必須滿足以下3個條件:

  • form表單的method屬性設置為post;
  • form表單的enctype屬性設置為multipart/form-data;
  • 提供< input type="file" name="filename" />的文件上傳輸入框。

文件上傳表單示例如下

  1. <form action="uploadUrl" method="post" enctype="multipart/form-data"
  2.  
  3.   <input type="file" name="filename" multiple="multiple" /> 
  4.  
  5.   <input type="submit" value="文件上傳" /> 
  6.  
  7. </form> 

multiple屬性是HTML5中新屬性,可實現多文件上傳

當form表單的enctype屬性為multipart/form-data時,瀏覽器就會采用二進制流來處理表單數據,服務器端就會對文件上傳的請求進行解析處理。Spring MVC通過MultipartResolver實現文件上傳功能。MultipartResolver是一個接口對象,需要通過它的實現CommonsMultipartResolver來完成文件上傳工作。

MultipartResolver配置示例如下:

  1. <bean id="multipartResolver"                 
  2.      class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
  3.     設置請求編碼格式,必須與JSP中的pageEncoding屬性一致,默認為ISO-8859-1 
  4.     <property name="defaultEncoding" value="UTF-8" /> 
  5.     設置允許上傳文件的最大值(2M),單位為字節 
  6.     <property name="maxUploadSize" value="2097152" /> 
  7.              ... 
  8. </bean> 

在前面的配置代碼中,除配置了CommonsMultipartResolver類外,還通過< property>元素配置了編碼格式以及允許上傳文件的大小。通過< property>元素可以對文件解析器類CommonsMultipartResolver的如下屬性進行配置:

  • maxUploadSize:上傳文件最大長度(以字節為單位);
  • maxInMemorySize:緩存中的最大尺寸;
  • defaultEncoding:默認編碼格式;
  • resolveLazily:推遲文件解析,以便在Controller中捕獲文件大小異常。

注意:因為MultipartResolver接口的實現類CommonsMultipartResolver內部是引用multipartResolver字符串獲取該實現類對象并完成文件解析的,所以在配置CommonsMultipartResolver時必須指定該Bean的id為multipartResolver。

由于CommonsMultipartResolver是Spring MVC內部通過Apache Commons FileUpload技術實現的,所以Spirng MVC的文件上傳還需要依賴Apache Commons FileUpload的組件,即需要導入支持文件上傳的相關JAR包。

  • commons-fileupload-1.3.2.jar
  • lcommons-io-2.5.jar

當完成頁面表單和文件上傳解析器的配置后,在Controller中編寫文件上傳的方法即可實現文件上傳,其代碼如下所示:

  1.  /** 
  2.      * 執行文件上傳 
  3.      * @param name 
  4.      * @param uploadfile 
  5.      * @param request 
  6.      * @return 
  7.      */ 
  8. @RequestMapping("/fileUpload"
  9. public String handleFormUpload(@RequestParam("name") String name
  10.                                    @RequestParam("uploadfile") List<MultipartFile> uploadfile,//使用MultipartFile 綁定接收上傳文件 
  11.                                    HttpServletRequest request) { 
  12.         // 判斷所上傳文件是否存在 
  13.         if (!uploadfile.isEmpty() && uploadfile.size() > 0) { 
  14.             //循環輸出上傳的文件 
  15.             for (MultipartFile file : uploadfile) { 
  16.                 // 獲取上傳文件的原始名稱 
  17.                 String originalFilename = file.getOriginalFilename(); 
  18.                 // 設置上傳文件的保存地址目錄 
  19.                 String dirPath = 
  20.                         request.getServletContext().getRealPath("/upload/"); 
  21.                 File filePath = new File(dirPath); 
  22.                 // 如果保存文件的地址不存在,就先創建目錄 
  23.                 if (!filePath.exists()) { 
  24.                     filePath.mkdirs(); 
  25.                 } 
  26.                 // 使用UUID重新命名上傳的文件名稱(上傳人_uuid_原始文件名稱) 
  27.                 String newFilename = name + "_" + UUID.randomUUID() + 
  28.                         "_" + originalFilename; 
  29.                 try { 
  30.                     // 使用MultipartFile接口的方法完成文件上傳到指定位置 
  31.                     file.transferTo(new File(dirPath + newFilename)); 
  32.                 } catch (Exception e) { 
  33.                     e.printStackTrace(); 
  34.                     return "error"
  35.                 } 
  36.             } 
  37.             // 跳轉到成功頁面 
  38.             return "success"
  39.         } else { 
  40.             return "error"
  41.         } 
  42.     } 

在上述代碼中,包含一個MultipartFile接口類型的參數file,上傳到程序中的文件是被封裝在該參數中的。

org.springframework.web.multipart.MultipartFile接口中提供了獲取上傳文件、文件名稱等方法,如下表所示:

代碼實現:

fileUpload.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" 
  2.          pageEncoding="UTF-8" %> 
  3. <!DOCTYPE html> 
  4. <html> 
  5. <head> 
  6.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"
  7.     <title>文件上傳</title> 
  8.     <script> 
  9.         // 判斷是否填寫上傳人并已選擇上傳文件 
  10.         function check() { 
  11.             var name = document.getElementById("name").value; 
  12.             var file = document.getElementById("file").value; 
  13.             if (name == "") { 
  14.                 alert("填寫上傳人"); 
  15.                 return false
  16.             } 
  17.             if (file.length == 0 || file == "") { 
  18.                 alert("請選擇上傳文件"); 
  19.                 return false
  20.             } 
  21.             return true
  22.         } 
  23.     </script> 
  24. </head> 
  25. <body> 
  26. <form action="${pageContext.request.contextPath }/fileUpload" 
  27.       method="post" enctype="multipart/form-data" onsubmit="return check()"
  28.     上傳人:<input id="name" type="text" name="name"/><br/> 
  29.     請選擇文件:<input id="file" type="file" name="uploadfile" 
  30.                  multiple="multiple"/><br/> 
  31.     <input type="submit" value="上傳"/> 
  32. </form> 
  33. </body> 
  34. </html> 

2. 文件下載

文件下載就是將文件服務器中的文件下載到本機上。在Spring MVC環境中,實現文件下載大致可分為如下兩個步驟:

在客戶端頁面使用一個文件下載的超鏈接,該鏈接的href屬性要指定后臺文件下載的方法以及文件名(需要先在文件下載目錄中添加了一個名稱為“1.jpg”的文件)。

  1. <a href="${pageContext.request.contextPath }/download?filename=1.jpg"
  2.      文件下載  
  3. </a> 

在后臺使用Spring MVC提供的ResponseEntity類型對象完成文件下載,使用它可以很方便的定義返回的HttpHeaders對象和HttpStatus對象,通過對這兩個對象的設置,即可完成下載文件時所需的配置信息。

  1. @RequestMapping("/download"
  2. public ResponseEntity<byte[]> fileDownload(HttpServletRequest request, 
  3.                                                String filename) throws Exception { 
  4.         // 指定要下載的文件所在路徑 
  5.         String path = request.getServletContext().getRealPath("/upload/"); 
  6.         // 創建該文件對象 
  7.         File file = new File(path + File.separator + filename); 
  8.         // 對文件名編碼,防止中文文件亂碼 
  9.         filename = this.getFilename(request, filename); 
  10.         // 設置響應頭 
  11.         HttpHeaders headers = new HttpHeaders(); 
  12.         // 通知瀏覽器以下載的方式打開文件 
  13.         headers.setContentDispositionFormData("attachment", filename); 
  14.         // 定義以流的形式下載返回文件數據 
  15.         headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); 
  16.         // 使用Sring MVC框架的ResponseEntity對象封裝返回下載數據 
  17.         return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), 
  18.                 headers, HttpStatus.OK); 

文件下載中的ResponseEntity對象有些類似前面章節中的@ResponseBody注解,它用于直接返回結果對象。

響應頭信息中的MediaType代表的是Interner Media Type(即互聯網媒體類型),也叫做MIME類型,MediaType.APPLICATION_OCTET_STREAM的值為application/octet-stream,即表示以二進制流的形式下載數據;

HttpStatus類型代表的是Http協議中的狀態,示例中的HttpStatus.OK表示200,即服務器已成功處理了請求。

當對中文名文件下載時會怎樣?

當對中文名稱的文件進行下載時,因為各個瀏覽器內部轉碼機制的不同,就會出現不同的亂碼以及解析異常問題。

如何解決中文名文件下載亂碼問題呢?

為了解決瀏覽器中文件下載時中文名稱的亂碼問題,可以在前端頁面發送請求前先對中文名進行統一編碼,然后在后臺控制器類中對文件名稱進行相應的轉碼。

在下載頁面中對中文文件名編碼。可以使用Servlet API中URLEncoder.encoder(String s, String enc)方法將中文轉為UTF-8編碼。

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
  2.   <%@page import="java.net.URLEncoder"%> 
  3.   ... 
  4.   <body> 
  5.       <a href="${pageContext.request.contextPath }/download?filename=<%=URLEncoder.encode(“  
  6.         壁紙.jpg", "UTF-8")%>"
  7.  中文名稱文件下載 </a> 
  8.     </body> 
  9. </html> 

在控制器類中編寫對中文名文件下載時進行轉碼編碼的方法。

  1. public String getFilename(HttpServletRequest request,String filename) throws Exception {  
  2.           String[] IEBrowserKeyWords = {"MSIE""Trident""Edge"};   
  3.           String userAgent = request.getHeader("User-Agent");   
  4.           for (String keyWord : IEBrowserKeyWords) {  
  5.                 if (userAgent.contains(keyWord)) {  
  6.                         return URLEncoder.encode(filename, "UTF-8"); 
  7.                 } 
  8.           }   
  9.           return new String(filename.getBytes("UTF-8"), "ISO-8859-1");   
  10. }  

總結

本章主要對Spring MVC環境下的文件上傳和下載進行了詳細講解。

首先講解了如何實現文件上傳,并通過一個應用案例來演示文件上傳功能的實現;

然后講解了非中文名稱文件下載的實現過程,以及中文名稱文件下載的實現過程。

通過本章的學習,我們要學會如何在Spring MVC環境下進行文件上傳和下載,并能夠掌握中文名稱文件下載時亂碼的解決方案。

 

責任編輯:武曉燕 來源: 程序員千羽
相關推薦

2021-05-17 10:50:15

系統調用內核

2021-07-07 22:27:54

磁盤分區硬盤

2024-05-06 12:23:00

GenAI人工智能

2020-12-18 06:09:07

Java淺拷貝深拷貝

2020-05-18 14:12:41

PostgreSQLDB架構數據庫

2023-03-15 10:38:55

2023-11-28 12:42:56

數據分析管理

2021-03-10 10:00:31

Go語言strconv包類型轉換工具

2018-09-03 13:39:43

手機蘋果iPhone

2024-08-28 17:28:26

2021-03-11 07:14:01

Epoll原理線程

2021-07-27 05:32:22

CSS 技巧方位與順序

2021-04-01 06:23:24

CSS33D3D Web 動畫

2022-08-17 11:36:18

Vue3插件

2021-04-23 10:38:52

Spring BootSpringMVC源碼

2021-07-12 23:21:52

MyISAM引擎InnoDB

2021-03-04 08:06:13

Java代理機制

2021-02-03 12:47:09

Spring Boot應用監控

2022-09-13 10:40:48

Flowable功能Spring

2021-08-02 12:50:45

sessiontokenJava
點贊
收藏

51CTO技術棧公眾號

亚洲国产精品一区| 欧美精品一区视频| 欧美特黄一区| 亚洲国产sm捆绑调教视频| 8050国产精品久久久久久| 中文字幕第17页| 偷偷操不一样的久久| 久久精品 人人爱| 91丨九色丨蝌蚪富婆spa| 久久久国产视频| 色一情一乱一伦一区二区三区日本| 国产xxxx孕妇| 久久久久久久久国产一区| 欧美午夜精品久久久久久人妖| 98国产高清一区| 国产老头老太做爰视频| 播放一区二区| 国产亚洲精品资源在线26u| 久久精品国产99国产精品澳门 | 91国产丝袜在线放| 美日韩一二三区| 欧美视频网站| 日韩中文视频免费在线观看| 日本不卡在线观看视频| 日韩在线观看视频一区二区三区| 欧美黄色一区| 日韩美女主播在线视频一区二区三区| 国产又爽又黄ai换脸| 五月激情丁香网| 欧美日韩中文一区二区| 欧美在线free| 亚洲欧洲一二三| 国产精品人人妻人人爽| 亚洲欧洲日韩| 日韩亚洲欧美高清| 真实国产乱子伦对白视频| 成人久久久精品国产乱码一区二区 | 国产一区免费| 久久综合激情网| eeuss鲁片一区二区三区| 亚洲综合在线免费观看| 国产精品加勒比| 羞羞影院体验区| 欧美国产日本| 美日韩精品免费观看视频| 日韩大尺度视频| 1234区中文字幕在线观看| 亚洲色图插插| 自拍偷拍亚洲欧美| xxxx在线免费观看| 好吊日av在线| 国产午夜精品一区二区三区嫩草| 国产在线精品日韩| 亚洲欧美强伦一区二区| 国产精品996| 2019日本中文字幕| 成年人视频软件| 亚洲国产高清在线观看| 欧美日韩国产精品| 亚洲精品一区二区三| 你懂的好爽在线观看| 美美哒免费高清在线观看视频一区二区 | 亚洲欧美激情视频在线观看一区二区三区 | 精品久久毛片| 欧美日韩国产综合一区二区三区| 欧美少妇一级片| 久操视频在线观看| av成人免费在线| 国产精品香蕉国产| 中文字幕第28页| 成人在线免费观看视频| 欧美大片在线观看| av不卡中文字幕| 久久99国产精品二区高清软件| 在线观看av不卡| 久久国产午夜精品理论片最新版本| 国产在线超碰| av成人动漫在线观看| 久久精品人成| 不卡av中文字幕| 美女任你摸久久| 欧美一区二粉嫩精品国产一线天| 久久精品视频5| 亚洲午夜电影| 久热精品视频在线观看一区| 波多野吉衣中文字幕| 外国成人直播| 亚洲国产欧美在线人成| 国产中文字幕视频在线观看| av在线app| 国产精品美女久久久久久久久久久| 九色一区二区| 粉嫩一区二区三区国产精品| 久久影院午夜论| 国产一区二区三区四区五区在线| 欧美男男同志| 亚洲图片你懂的| 一区二区冒白浆视频| 色鬼7777久久| www..com久久爱| 日韩精品在在线一区二区中文| 色呦呦中文字幕| 狠狠色丁香久久婷婷综合_中 | 美女久久久久久| 日韩无一区二区| 加勒比综合在线| 综合激情网站| 国产成人一区二区三区| 国产精品黄色网| 欧美破处大片在线视频| 日本精品视频网站| 国产成人在线播放视频| 免费不卡在线观看| 国产欧美亚洲日本| 国产激情在线视频| 色狠狠av一区二区三区| 男女av免费观看| 女厕盗摄一区二区三区| 亚洲国产裸拍裸体视频在线观看乱了| 国产第一页视频| 快播电影网址老女人久久| 91国产免费观看| 香蕉久久久久久av成人| 欧美日韩在线网站| 日本国产精品视频| 免费在线不卡av| 99re热视频这里只精品 | 妖精视频一区二区三区免费观看| 亚洲精品国产福利| 91丝袜在线观看| 亚洲三级网页| 久久免费视频在线| 少妇一级淫片免费放中国 | 国产丝袜精品丝袜| 91精品国产综合久久久蜜臀图片| 亚洲高清在线不卡| 日韩一区二区三区精品| 中文字幕在线看视频国产欧美| 成人精品免费在线观看| 不卡一区在线观看| 欧美日韩国产综合在线| seseavlu视频在线| 亚洲视频一区二区在线| 香蕉视频禁止18| 日韩综合一区二区三区| 久久精品国亚洲| 亚洲怡红院av| 成人一级片网址| 久久精品aaaaaa毛片| 欧美videosex性极品hd| 欧美香蕉大胸在线视频观看| 黄色污在线观看| 日产精品一区二区| 欧美大片免费看| 一级黄色av片| 国产91丝袜在线观看| 欧美极品视频一区二区三区| 国产乱码午夜在线视频| 欧美日韩专区在线| 亚洲精品久久一区二区三区777| 久久麻豆精品| 91精品国产高清| 四虎永久在线观看| 欧美体内谢she精2性欧美| 在线免费观看成年人视频| 希岛爱理av一区二区三区| 国产视频999| 日韩在线无毛| 一本高清dvd不卡在线观看| 特黄特黄一级片| 日韩手机在线| 久久99视频精品| 亚洲一区二区三区高清视频| 国产精品久久久久久久久图文区 | 日本成人不卡| 亚洲精品720p| 中文在线免费观看| 成人激情免费电影网址| 欧美亚洲日本一区二区三区 | 91情侣在线视频| 成人性生交大片免费看在线播放| 日韩成人av一区| 国产又黄又爽又无遮挡| 日韩av高清在线观看| 精品不卡在线| 呦呦在线视频| 911精品国产一区二区在线| 亚洲av无码一区二区三区在线| 国产亚洲网站| 国产精品av一区| 成a人片在线观看| 精品电影一区二区三区| 区一区二在线观看| 亚洲日本在线天堂| 中文字幕 日本| 久久99国产精品久久99果冻传媒| 欧美日韩在线高清| 青青久久精品| 中文字幕精品久久| 成人免费公开视频| 欧美午夜免费电影| 久久露脸国语精品国产91| 国产精品久久二区二区| www.四虎精品| 久久精品av麻豆的观看方式| 国产成人精品视频免费看| 亚欧美无遮挡hd高清在线视频| 免费观看成人在线| 日韩精品三区| 欧美激情综合色| 亚洲女人18毛片水真多| 在线视频国内自拍亚洲视频| 国产亚洲精品女人久久久久久| 国产精品视频九色porn| 99久久人妻精品免费二区| 国模一区二区三区白浆| 北条麻妃在线视频| 在线欧美日韩| 麻豆久久久9性大片| 亚洲成av人片在线观看www| 国产欧美日韩精品丝袜高跟鞋| 在线黄色的网站 | 色欧美激情视频在线| 欧美三级电影网| 久久夜色精品国产噜噜亚洲av| 亚洲综合图片区| 国产高潮流白浆| 国产精品久久久久四虎| 中文字幕在线观看免费高清| 美女网站在线免费欧美精品| www.四虎成人| 国产伦理一区| 北条麻妃69av| 亚洲大胆在线| 日韩五码在线观看| 国产成人手机高清在线观看网站| 国产精品aaa| 伊人久久国产| 久久精品精品电影网| 在线激情网站| 精品久久久三级丝袜| av资源免费观看| 五月综合激情日本mⅴ| 六月婷婷七月丁香| 2023国产精品| 18禁裸乳无遮挡啪啪无码免费| aaa国产一区| 中文字幕一区三区久久女搜查官| 福利电影一区二区| 亚洲少妇一区二区三区| 本田岬高潮一区二区三区| 国产白袜脚足j棉袜在线观看| 亚洲综合好骚| 在线观看视频黄色| 婷婷久久国产对白刺激五月99| 国产伦一区二区三区色一情| 操欧美女人视频| 国产亚洲情侣一区二区无| 成人自拍在线| 青草成人免费视频| 欧美黄色三级| 国产欧美日韩高清| 日韩欧美中文字幕一区二区三区| www.成人三级视频| 亚洲天堂一区二区| 国产成人精品av| 欧美成人xxxx| 亚洲www在线| 日韩美女在线看免费观看| 国产成人啪精品视频免费网| 成人看片网页| 91沈先生在线观看| 三级成人在线| 成人在线国产精品| 四虎4545www国产精品| 国产精品日韩久久久久| 在线人成日本视频| 97久久亚洲| 成人av中文| 欧美日韩123| 99c视频在线| 欧美一级色片| 国产99午夜精品一区二区三区| 一区二区三区四区视频免费观看 | 亚洲国语精品自产拍在线观看| 欧洲毛片在线| 日韩中文字幕在线精品| 性插视频在线观看| 日韩免费福利电影在线观看| 天天操天天操天天| 一本一本久久a久久精品综合小说| 天堂中文在线观看视频| 影音先锋日韩有码| 色综合999| 久久天天躁狠狠躁夜夜爽蜜月| 黄页网站在线| 国产精品久久久久久久久久小说| 精品视频在线观看免费观看| 国产精品直播网红| 日本成人手机在线| 欧美午夜欧美| 精品产国自在拍| 青青草国产免费| 麻豆一区二区99久久久久| 美女黄色一级视频| 国产精品福利在线播放| 国产免费av一区二区| 91麻豆精品91久久久久同性| 欧洲一级在线观看| 欧美激情成人在线视频| 国内欧美日韩| 欧美人xxxxx| 亚洲激情专区| 日本美女久久久| 国产精品无遮挡| 黄色片网站免费| 污片在线观看一区二区| 天天综合网入口| 欧美一区二区三区小说| 国产高清免费av| 在线观看视频亚洲| а√天堂8资源中文在线| 3d动漫精品啪啪一区二区三区免费 | 欧美福利第一页| 好吊成人免视频| 天天操天天射天天舔| 欧美—级a级欧美特级ar全黄| 亚洲一区有码| 51精品国产人成在线观看| 欧美伦理在线视频| 亚洲色欲综合一区二区三区| 国产91丝袜在线观看| 欧美国产在线看| 欧美日韩一级二级| 成a人v在线播放| 国产精品极品美女在线观看免费| av激情成人网| 蜜桃视频在线观看成人| 亚洲一区日韩| 中文精品在线观看| 黑人精品xxx一区| 欧美男男激情freegay| 国产91色在线播放| 国产成人3p视频免费观看| 日批视频在线免费看| 久久综合丝袜日本网| 亚洲视频 欧美视频| 亚洲欧美激情四射在线日| 欧美高清视频| 欧美激情亚洲另类| 97久久精品| 国产在线精品91| 91亚洲精品一区二区乱码| 日韩三级视频在线| 日韩h在线观看| 天天综合网天天| 亚洲图片欧洲图片日韩av| 麻豆成人综合网| 国产黄在线免费观看| 日韩一级成人av| √8天堂资源地址中文在线| 国产精品一区二区三区在线| 亚洲黄色视屏| 亚洲欧美一区二区三区国产精品 | 成人免费在线| 欧美一级视频在线观看| 国产精品中文字幕亚洲欧美| 亚洲精品一二三四五区| 美国欧美日韩国产在线播放| 日韩精品久久久久久久的张开腿让| 欧美日韩一区高清| 成年人网站在线| 久久大香伊蕉在人线观看热2| 日韩在线观看一区二区| 极品白嫩少妇无套内谢| 香蕉影视欧美成人| 黄色av网址在线免费观看| 国产日韩欧美中文| 欧美精品一卡| www.久久国产| 在线不卡免费欧美| 岛国视频免费在线观看| 国产精品普通话| 欧美国产免费| 亚洲综合色一区| 欧美一级夜夜爽| 永久免费毛片在线播放| 小说区视频区图片区| av欧美精品.com| 亚洲天堂男人网| 国语自产精品视频在线看一大j8 | 久久综合国产精品| 91国偷自产中文字幕久久| 亚洲精品日韩在线| 97蜜桃久久| 天堂√在线观看一区二区| 久久精品导航| 新91视频在线观看| 日韩一区和二区| 综合在线影院|