一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring MVC的文件上傳和下載以及攔截器的使用實例

Spring MVC的文件上傳和下載以及攔截器的使用實例

2020-12-12 15:47落葉飛逝的戀 Java教程

這篇文章主要介紹了Spring MVC的文件上傳和下載以及攔截器的使用實例,具有一定的參考價值,有興趣的可以了解一下

Spring MVC會根據請求方法的簽名不同,將請求消息中的信息以一定的方式轉換并綁定到請求方法的參數中。

1.文件上傳

文件上傳,必須將表單的method設置為POST,并將enctype設置為multipart/form-data。只有這樣,才能將文件的二進制數據發送給服務器。

Spring 3.0規范提供了方法來處理文件上傳,但是這種上傳需要在Servlet中完成。而Spring MVC封裝了上傳功能,使用了Apache Commons FileUpload技術來實現了一個MultipartResolver實現類。

Spring MVC依賴的組件包

 

復制代碼 代碼如下:
compile group: 'commons-fileupload', name: 'commons-fileupload', version: '1.3.3'

 

 

xml配置

?
1
2
3
4
5
6
7
8
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
 <property name="maxUploadSize">
  <value>10485760</value>
 </property>
 <property name="defaultEncoding">
  <value>UTF-8</value>
 </property>
</bean>

后臺代碼

新建上傳FileModel

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class FileDataModel implements Serializable {
 private String filename;
 
 private MultipartFile file;
 
 public String getFilename() {
  return filename;
 }
 
 public void setFilename(String filename) {
  this.filename = filename;
 }
 
 public MultipartFile getFile() {
  return file;
 }
 
 public void setFile(MultipartFile file) {
  this.file = file;
 }
}

Controller代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@Controller
@RequestMapping("file")
public class FileController {
 
 @RequestMapping("upload")
 public String upload() {
  return "upload";
 }
 
 @RequestMapping(value = "upload", method = RequestMethod.POST)
 public String uoload(FileDataModel fileDataModel, HttpServletRequest request, Model model) {
  FileResult fileResult = new FileResult();
  try {
   if (fileDataModel.getFilename().isEmpty() || fileDataModel.getFile() == null)
    throw new IllegalArgumentException("上傳文件名稱為空或者無上傳文件");
   String filePath = request.getServletContext().getRealPath("/files");
   String filename = fileDataModel.getFile().getOriginalFilename();
   File savePath = new File(filePath, filename);
   if (!savePath.getParentFile().exists())
    savePath.getParentFile().mkdir();
   fileDataModel.getFile().transferTo(new java.io.File(filePath + java.io.File.separator + filename));
   fileResult.setTitle("上傳成功");
   fileResult.setMessage("上傳成功");
   fileResult.setSuccess(true);
  } catch (Exception ex) {
   fileResult.setTitle("上傳失敗!");
   fileResult.setMessage(ex.getMessage());
  }
  model.addAttribute("fileResult", fileResult);
  return "fileresult";
 }
}

前臺JSP頁面

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>Upload</title>
</head>
<body>
<form action="/file/upload" enctype="multipart/form-data" method="post">
 <table>
  <tr>
   <td>文件描述:</td>
   <td><input type="text" name="filename"/></td>
  </tr>
  <tr>
   <td>請選擇文件:</td>
   <td><input type="file" name="file"/></td>
  </tr>
  <tr>
   <td>
    <input type="submit" value="上傳"/>
   </td>
  </tr>
 </table>
</form>
</body>
</html>

1.1Spring MVC的MultipartFile的常用方法

獲取文件數據
1.[] getBytes() throws IOException;

獲取文件的MIME類型,如image/jpeg等
2.String getContentType();

獲取文件流
3.InputStream getInputStream() throws IOException;

獲取表單中文件組件的名字
4.String getName();

獲取上傳文件的原名
5.String getOriginalFilename();

獲取文件的字節大小,單位為byte
6.long getSize();

是否有上傳的文件
7.boolean isEmpty();

將上傳文件保存到一個目標文件中
8.void transferTo(File dest) throws IOException, IllegalStateException;

2.文件下載

Spring MVC提供了一個ResponseEntity類型,使用它可以很方便的定義返回的HttpHeader和HttpStatus

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@RequestMapping("download")
public ResponseEntity<byte[]> download(HttpServletRequest request, @RequestParam("filename") String filename, Model model) {
ResponseEntity<byte[]> responseEntity = null;
try {
 String path = request.getServletContext().getRealPath("/files");
 String realPath = path + File.separator + filename;
 File file = new File(realPath);
 HttpHeaders headers = new HttpHeaders();
 String downFileName = new String(filename.getBytes("UTF-8"), "iso-8859-1");
 //通知瀏覽器以attachment(下載方式)打開圖片
 headers.setContentDispositionFormData("attachment", downFileName);
 //以二進制流數據方式進行下載
 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
 responseEntity = new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
 
} catch (Exception ex) {
 ex.printStackTrace();
}
return responseEntity;
?
1
2
3
4
5
6
7
8
9
10
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>${requestScope.fileResult.title}</title>
</head>
<body>
 <h1>${requestScope.fileResult.message}</h1><br/>
 <a href="/file/download?filename=${requestScope.fileResult.fileName}" rel="external nofollow" >${requestScope.fileResult.fileName}</a>
</body>
</html>

3.攔截器

Interceptor攔截器是Spring MVC中相當重要的功能,它的功能作用是攔截用戶的請求并進行相對應的處理。比如通過攔截器進行用戶權限驗證,或者判斷用戶是否已經登錄等。

Spring MVC 攔截器是可插拔式的設計。如果需要使用某個攔截器,只需要在配置文件中應用攔截器即可。

3.1 HandlerInterceptor接口

Spring MVC中的Interceptor攔截器請求是通過實現HandlerInterceptor接口來完成的。

3.2實現攔截器

1.自定義類實現Spring的HandlerInterceptor接口

重要接口

該請求方法將在請求處理之前被調用。這個方法的作用是對進行調用方法前進行一些前置初始化操作,進行判斷用戶請求是否可以進行下去。當方法返回false的時候,后續的Interceptor及Controller都不會繼續執行。

?
1
2
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception;

該方法是在perHandle返回true時,在調用目標方法處理之后,在返回視圖之前調用。這時候我們可以針對Controller處理之后的ModelAndView對象進行操作。

?
1
2
3
void postHandle(
  HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
  throws Exception;

該方法是在整個請求處理結束之后,也就是在DispatcherServlet渲染了對應的視圖之后執行。主要用于清理資源。

?
1
2
3
void afterCompletion(
   HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
   throws Exception;

2.自定義類繼承HandlerInterceptorAdapter

代碼演示

實現HandlerInterceptor

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class AuthorizationInterceptor implements HandlerInterceptor {
 
 /**
  * 不攔截用戶登錄頁面及注冊頁面
  */
 private static final String[] IGNORE_URI = {"user/login", "user/signup"};
 
 @Override
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  boolean flag = false;
  String servletPath = request.getServletPath();
  for (String url : IGNORE_URI) {
   if (servletPath.contains(url)) {
    flag = true;
    break;
   }
  }
  if (!flag) {
   User user = (User) request.getSession().getAttribute("user");
   if (user == null) {
    request.setAttribute("message", "請先登錄再訪問網站");
    request.getRequestDispatcher("user/login").forward(request, response);
   } else
    flag = true;
  }
  return flag;
 }
 
 @Override
 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
 
 }
 
 @Override
 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
 
 }
}

xml配置

?
1
2
3
4
5
6
<mvc:interceptors>
 <mvc:interceptor>
  <mvc:mapping path="/home/index"/>
  <bean class="utils.AuthorizationInterceptor"/>
 </mvc:interceptor>
</mvc:interceptors>

當訪問home/index的時候需要進行驗證

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.jianshu.com/p/0e936395066b?utm_source=tuicool&utm_medium=referral

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲天堂一区二区在线观看 | 暖暖视频高清图片免费完整版 | 香蕉久草在线 | 14一18cad中国大学生 | 爱情岛论坛亚洲一号路线 | 女人和男人搞鸡 | 日本三级s级在线播放 | 亚洲国产精品婷婷久久久久 | 久久精品国产免费播高清无卡 | 99在线视频精品费观看视 | porno日本大学生高清 | 四虎影院在线 | 婷婷在线成人免费观看搜索 | 成年女人毛片免费观看中文w | 91久久国产露脸精品 | 日本在线看 | 2021海角社区最新版 | 国产一区日韩二区欧美三 | 男女天堂 | 香蕉91视频| 女医学护士一级毛片 | 亚洲精品免费视频 | 亚洲一级视频在线观看 | 久久天天躁狠狠躁夜夜躁 | 日韩一级欧美一级一级国产 | 亚洲国产成人久久精品影视 | 国产99页 | 亚洲高清免费在线观看 | 精品一久久香蕉国产线看观 | 和日本免费不卡在线v | 日韩欧美亚洲一区二区综合 | 精品国产剧情在线观看 | 四虎导航 | 久久婷婷五月免费综合色啪 | 国产成人精视频在线观看免费 | 免费亚洲一区 | 女同久久另类99精品国产 | 爱情岛论坛亚洲品质自拍视频 | 无码乱人伦一区二区亚洲 | 亚洲国产欧美在线人成 | 白丝美女用胸伺候主人 |