文件上傳完畢返回頁面用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對象。