SpringMVC文件下載


文件上傳完畢返回頁面用Model對象帶回filename,在webapps的該應用目錄下,已經存在上傳文件。

頁面

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html>
 4 <html>
 5 <head>
 6 <meta charset="UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10     <h2>用戶注冊</h2>
11     <form action="register" enctype="multipart/form-data" method="post">
12         <table>
13             <tr>
14                 <td>用戶名:</td>
15                 <td><input type="text" name="username"></td>
16             </tr>
17             <tr>
18                 <td>請上傳頭像:</td>
19                 <td><input type="file" name="image"></td>
20             </tr>
21             <tr>
22                 <td><input type="submit" value="注冊"></td>
23             </tr>
24         </table>
25     </form>
26     
27     <script type="text/javascript">
28         function test() {
29             var filename = document.getElementById("filename");
30             alert(encodeURIComponent(filename));
31         }
32     </script>
33     
34     <h3>文件下載</h3>
35     <a href="javascript:window.location.href='download?filename=' + 
36         encodeURIComponent('${requestScope.filename }')">
37         ${requestScope.filename }
38     </a>
39 </body>
40 </html>

文件上傳與下載

SpringMVC提供了一個ResponseEntity類型,使用它可以很方便定義返回的BodyBuilder、HttpHeaders、HttpStatus。

 2     public String register(HttpServletRequest request, @ModelAttribute User user, Model model) throws IllegalStateException, IOException {
 3         System.out.println(user.getUsername());
 4         // 如果上傳文件部位空,寫入上傳文件路徑
 5         if (!user.getImage().isEmpty()) {
 6             // 上傳路徑
 7             String path = request.getServletContext().getRealPath("/images");
 8             // 上傳文件名
 9             String filename = user.getImage().getOriginalFilename();
10             File filepath = new File(path, filename);
11             // 判斷路徑是否存在,不存在就創建一個
12             if (!filepath.getParentFile().exists()) {
13                 filepath.getParentFile().mkdirs();
14             }
15             // 將上傳文件保存到一個目標文件中
16             user.getImage().transferTo(new File(path + File.separator + filename));
17             // 將文件名保存到model中
18             model.addAttribute("filename", filename);
19             System.out.println("文件上傳路徑:" + (path + File.separator + filename));
20             return "userInfo";
21         } else {
22             return "error";
23         }
24     }
25         
26     @RequestMapping(value="/download")
27     public ResponseEntity<byte[]> download(HttpServletRequest request, @RequestParam("filename") String filename,
28             @RequestHeader("User-Agent") String userAgent) throws IOException {
29         // 下載文件的路徑
30         String path = request.getServletContext().getRealPath("/images");
31         // 構建File
32         File file = new File(path + File.separator + filename);
33         // ok表示http請求中狀態碼200
34         BodyBuilder builder = ResponseEntity.ok();
35         // 內容長度
36         builder.contentLength(file.length());
37         // application/octet-stream 二進制數據流(最常見的文件下載)
38         builder.contentType(MediaType.APPLICATION_OCTET_STREAM);
39         // 使用URLEncoding.decode對文件名進行解碼
40         filename = URLEncoder.encode(filename, "UTF-8"); 
41         // 根據瀏覽器類型,決定處理方式
42         if (userAgent.indexOf("MSIE") > 0) {
43             builder.header("Content-Disposition", "attachment; filename=" + filename);
44         } else {
45             builder.header("Content-Disposition", "attacher; filename*=UTF-8''" + filename);
46         }
47         return builder.body(FileUtils.readFileToByteArray(file));
48     }

FileUtils類是Apache Commons FileUpload組件,用於讀取文件,並將其構建為ResponseEntity對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM