Spring MVC多種情況下進行文件上傳的實例
一、原生方式上傳
上傳是Web工程中很常見的功能,SpringMVC框架簡化了文件上傳的代碼,我們首先使用JAVAEE原生方式上傳文件來進行詳細(xì)描述:
1.1 修改web.xml項目版本
這里我們創(chuàng)建新的SpringMVC模塊,在web.xml中將項目從2.3改為3.1,即可默認(rèn)開啟el表達式,如下圖:
1.2 上傳JSP頁面
那這里我們需要訪問一個頁面來進行文件下載
upload.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>上傳</title> </head> <body> <h3>文件上傳</h3> <%-- 上傳表單的提交方式必須是post --%> <%-- enctype屬性為multipart/from-data,意思是不對表單數(shù)據(jù)進行編碼 --%> <form action="/fileUpload" method="post" enctype="multipart/form-data"> <%-- 文件選擇控件,類型是file,必須要有name屬性 --%> 選擇文件:<input type="file" name="upload"/> <input type="submit" value="上傳"> </form> </body> </html>
1.3 引入文件上傳依賴
接下來需要分析請求體中的文件項,并將數(shù)據(jù)寫入磁盤,此時需要借助文件上傳工具
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
1.4 分析控制器執(zhí)行流程
編寫控制器接收上傳請求,控制器進行三步操作:
- 創(chuàng)建文件夾,存放上傳文件。
- 分析請求體,找到上傳文件數(shù)據(jù)。
- 將文件數(shù)據(jù)寫入文件夾。
完整文件上傳控制器代碼如下:
package com.example.controller; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.WebResource; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.util.List; import java.util.UUID; @Controller public class UploadController { @RequestMapping("/fileUpload") public String upload(HttpServletRequest request) throws Exception{ // 創(chuàng)建文件夾,存放上傳文件 // 1.設(shè)置上傳文件夾的真實路徑 String realpath = request.getSession().getServletContext().getRealPath("/upload"); System.out.println(realpath); // 2.判斷目錄是否存在,如果不存在,創(chuàng)建該目錄 File file = new File(realpath); if(!file.exists()){ file.mkdirs(); } // 分析請求體,找到上傳文件數(shù)據(jù) // 1.創(chuàng)建磁盤文件工廠 DiskFileItemFactory factory = new DiskFileItemFactory(); // 2.創(chuàng)建上傳數(shù)據(jù)分析器對象 ServletFileUpload servletFileUpload = new ServletFileUpload(factory); // 3.利用分析器對象解析請求體,返回所有數(shù)據(jù)項 List<FileItem> fileItems = servletFileUpload.parseRequest(request); // 遍歷所有數(shù)據(jù),找到文件項(非表單項) for(FileItem fileItem:fileItems){ if(!fileItem.isFormField()){ // 將文件數(shù)據(jù)寫進文件夾 // 1.獲取文件名 String name = fileItem.getName(); // 2.將文件寫入磁盤 fileItem.write(new File(file,name)); System.out.println(file.getAbsoluteFile()); // 3.刪除內(nèi)存中的臨時文件 fileItem.delete(); } } return "index"; } }
文件成功下載后跳轉(zhuǎn)到默認(rèn)頁面。
1.5 測試結(jié)果
訪問路徑:http://localhost:8080/upload.jsp
點擊選擇文件,選擇要上傳的文件,然后點擊上傳。
OK,可以得到webapp目錄下面多了一個文件夾upload,并且里面有我們剛剛上傳的文件。 可以看得出來用原生的方式來完成文件上傳是比較麻煩的,接下來我們看一下用Spring MVC方式如何來進行文件上傳
二、Spring MVC 方式上傳
SpringMVC使用框架提供的文件解析器對象,可以直接將請求體中的文件數(shù)據(jù)轉(zhuǎn)為MultipartFile對象,從而省略原生上傳中分析請求體的步驟。
2.1 配置文件解析器
<!-- 文件解析器對象,id名稱必須是multipartResolver --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 支持一次上傳文件的總?cè)萘?。單位:字?jié)100M = 100*1024*1024 --> <property name="maxUploadSize" value="104857600"/> <!-- 文件名的編碼方式 --> <property name="defaultEncoding" value="utf-8"/> </bean>
2.2 創(chuàng)建JSP表單
upload2,.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>上傳</title> </head> <body> <h3>文件上傳</h3> <%-- 上傳表單的提交方式必須是post --%> <%-- enctype屬性為multipart/from-data,意思是不對表單數(shù)據(jù)進行編碼 --%> <form action="/fileUpload2" method="post" enctype="multipart/form-data"> <%-- 文件選擇控件,類型是file,必須要有name屬性 --%> 選擇文件:<input type="file" name="file"> <input type="submit" value="上傳"> </form> </body> </html>
其實這個JSP和上面那個沒什么區(qū)別,只是響應(yīng)處理的路徑不同,為了避免重復(fù)開關(guān)tomcat,因為就多編寫了一個表單。
2.3 控制器方法
// MultipartFile參數(shù)名必須和JSP文件空間的name屬性一致 @RequestMapping("/fileUpload2") public String upload2(MultipartFile file,HttpServletRequest request) throws Exception{ // 創(chuàng)建文件夾,存放上傳文件 String realpath = request.getSession().getServletContext().getRealPath("/upload"); File dir = new File(realpath); if(!dir.exists()){ dir.mkdirs(); } // 將上傳的數(shù)據(jù)寫到文件夾的文件中 // 1.拿到上傳的文件名 String filename = file.getOriginalFilename(); filename = UUID.randomUUID()+"_"+filename; // 2.創(chuàng)建空文件 File newFile = new File(dir,filename); // 3.將數(shù)據(jù)寫入空文件中 file.transferTo(newFile); return "index"; }
Ok,可以看到這個比上面那個簡單許多,只需要參數(shù)名和表單的name屬性一致便可以自動匹配。
2.4 測試結(jié)果
OK,訪問路徑:http://localhost:8080/upload2.jsp
看到如下圖,我們是成功上傳了呢
三、上傳多文件
SpringMVC支持一次性上傳多個文件,寫法如下:
3.1 JSP頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>上傳</title> </head> <body> <h3>文件上傳</h3> <%-- 上傳表單的提交方式必須是post --%> <%-- enctype屬性為multipart/from-data,意思是不對表單數(shù)據(jù)進行編碼 --%> <form action="/fileUpload3" method="post" enctype="multipart/form-data"> <%-- 文件選擇控件,類型是file,必須要有name屬性 --%> 用戶名:<input name="username"/><br/> 文件1:<input type="file" name="files"><br/> 文件2:<input type="file" name="files"><br/> <input type="submit" value="上傳"> </form> </body> </html>
3.2 控制器方法
// 處理多文件上傳,參數(shù)類型為MultipartFile數(shù)組參數(shù)名和JSP文件控件的name屬性一致 @RequestMapping("/fileUpload3") public String upload3(MultipartFile files[],String username,HttpServletRequest request) throws Exception{ System.out.println(username); // 1.設(shè)置上傳文件保存的文件夾 String realPath = request.getSession().getServletContext().getRealPath("/upload/files"); File dir = new File(realPath); if(!dir.exists()){ dir.mkdirs(); } // 2.遍歷數(shù)組,將上傳文件保存到文件夾 for(MultipartFile file:files){ String filename = file.getOriginalFilename(); filename = UUID.randomUUID()+"_" +filename; File newFile = new File(dir,filename); file.transferTo(newFile); } return "index"; }
這里我們可以知道,方法參數(shù)名改一下類型即可, 并且表單的文件name必須要一致,上傳后的文件放在upload文件夾子文件夾files里。
3.3 測試結(jié)果
OK,如下圖,我們是可以成功添加了files文件夾,并且里面也是有文件的
以上就是Spring MVC多種情況下進行文件上傳的實例的詳細(xì)內(nèi)容,更多關(guān)于Spring MVC文件上傳的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springboot+hutool批量生成二維碼壓縮導(dǎo)出功能
這篇文章主要介紹了springboot+hutool批量生成二維碼壓縮導(dǎo)出功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-10-10mybatis調(diào)用mysql存儲過程(返回參數(shù),單結(jié)果集,多結(jié)果集)
本文主要介紹了mybatis調(diào)用mysql存儲過程(返回參數(shù),單結(jié)果集,多結(jié)果集),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01Spring?@DateTimeFormat日期格式化時注解場景分析
這篇文章主要介紹了Spring?@DateTimeFormat日期格式化時注解場景分析,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05鎖超時發(fā)現(xiàn)parallelStream并行流線程上下文坑解決
這篇文章主要為大家介紹了鎖超時發(fā)現(xiàn)parallelStream并行流線程上下文坑解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08