一、搭建Spring開發環境
1.1 在web.xml 中配置Servlet
<!--配置MVC中央控制器:DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--初始化一些參數 init-->
<!--指定Spring配置檔案的路徑-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--容器在啟動時就加載Servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--設定此Servlet截獲并處理所有的URL請求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
1.2 springmvc-config.xml:
<context:component-scan base-package="com.ytzl.controller"/>
<context:component-scan base-package="com.ytzl.service"/>
<!--2、開啟mvc注解驅動:自動注冊生成兩個工具:處理器映射器(HandleMapping)和處理器擴充卡(HandleAdapter)-->
<mvc:annotation-driven/>
<!--配置視圖解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"/><!--字首-->
<property name="suffix" value=".jsp"/><!--字尾-->
</bean>
<!--配置全局異常捕獲-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.RuntimeException">error</prop>
</props>
</property>
</bean>
<!--配置檔案上傳-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--上傳檔案的最大大小-->
<property name="maxUploadSize" value="17367648787"></property>
<!--傳檔案的編碼 -->
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
二、建立頁面
2.2建立fileUpdate.jsp 頁面 需要注意的是form 表單 要加上 屬性entcypt=“multipart/form-data”,這表示上傳的将會是二進制流的格式,以規定的二進制進行上傳,便于伺服器處理,使用post請求:
<form action="FileUpdate" enctype="multipart/form-data" method="post">
<table>
<tr>
<td>請選擇檔案:</td>
<td><input type="file" name="file"></td>
</tr>
<tr>
<td>開始上傳</td>
<td><input type="submit" value="上傳"></td>
</tr>
</table>
</form>
</body>
2.2:再寫一個上傳成功的jsp頁面,主要是用來當上傳成功時候跳轉的頁面,命名為:success.jsp
<body>
<h2>檔案上傳成功!</h2>
</body>
2.3:然後再寫一個上傳失敗的頁面,主要是用來當上傳失敗的時候跳轉的頁面,命名為:error.jsp
<body>
<h2>檔案上傳失敗!請檢查檔案是否存在</h2>
</body>
2.3:建立控制器 SpringMVC 控制器
//檔案上傳
@RequestMapping(value = "/FileUpdate", method = RequestMethod.POST)
public String fileUpdate(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
if (!file.isEmpty()) {
String contextPath = request.getContextPath();//"/SpringMvcFileUpload" 項目路徑
String servletPath = request.getServletPath();//"/gotoAction" 本次請求的路徑
String scheme = request.getScheme();//"http" //協定
String storePath = "E:\\project\\SpringMvcFileUpload\\WebRoot\\images";//存放我們上傳的檔案路徑
String fileName = file.getOriginalFilename();
File filepath = new File(storePath, fileName); // 檔案的寫入的路徑
if (!filepath.getParentFile().exists()) {
filepath.getParentFile().mkdirs();//如果目錄不存在,建立目錄
}
try {
// file.transferTo(new File(storePath + File.separator + fileName));//把檔案寫入目标檔案位址
file.transferTo(new File(String.valueOf(filepath)));//把檔案寫入目标檔案位址
} catch (Exception e) {
e.printStackTrace();
return "error";
}
return "success";//傳回到成功頁面
} else {
return "error";//傳回到失敗的頁面
}
}
2.5:好了,到此我們就可以實作上傳功能了,釋出在Tomact容器裡,然後就可以進行上傳檔案了。在浏覽中輸入:自己伺服器 部署 的 項目路徑 具體的頁面請求如下,然後浏覽具體的檔案,點選上傳按鈕:
上傳成功!
三、檔案下載下傳 , 将檔案綁定到具體的對象上 首先定義 一個實體類 private MultipartFile file; 這個 對象主要用于 綁定 上傳的檔案
package com.ytzl.pojo;
import org.springframework.web.multipart.MultipartFile;
import java.io.Serializable;
public class UserFrom implements Serializable {
private String uname; // 與請求參數名稱相同
private String upass;
private String reupass;
private MultipartFile file; //上傳檔案會自動綁定到該屬性
//省略 getre seter 方法 ......
3.2建立一個 register.jsp 頁面 用于模拟使用者 注冊上傳頭像的 場景 如下
<form action="${pageContext.request.contextPath }/register" method="post" enctype="multipart/form-data" >
<table border=1 bgcolor="lightblue" align="center">
<tr><td>姓名:</td><td><input class="textSize" type="text" name="uname" /></td></tr>
<tr><td>密碼:</td><td><input class="textSize" type="password" maxlength="20" name="upass" /></td></tr>
<tr><td>确認密碼:</td><td><input class="textSize" type="password" maxlength="20" name="reupass" /></td></tr>
<tr><td>請選擇頭像:</td><td><input type="file" name="file"></td></tr>
<tr><td>開始上傳</td><td><input type="submit" value="上傳"></td></tr>
</table>
</form>
</body>
3.3:寫我們的方法控制器處理注冊邏輯的層的代碼,注意其中的user對象加入了@ModelAttribute注解,其主要作用是用來映射把上面的form表單的file屬性自動注入到對象裡面,還有Map<String,Object>
map主要是為了存放user對象,放在requestScope裡面,這樣就可用el表達式把其中的值取出來了。
//檔案下載下傳-檔案上傳
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String register(@ModelAttribute UserFrom user, HttpServletRequest request, Map<String, Object> map) {
MultipartFile file = user.getFile();
boolean empty = file.isEmpty();
String wrong = "success";
String good = "download";
if (!empty) {
String realPath = request.getServletContext().getRealPath("/images");
String uploadPath = "E:\\project\\SpringMvcFileUpload\\WebRoot\\images";
String headimageName = file.getOriginalFilename();
File imageFile = new File(uploadPath, headimageName);
try {
file.transferTo(new File(uploadPath + File.separator + headimageName));
} catch (IOException e) {
e.printStackTrace();
return wrong;
}
map.put("user", user);
return good;
} else {
return wrong;
}
}
3.4 我們再建立一個 download.jsp 頁面 用來 下載下傳我們 模拟注冊 上傳後的檔案
<body>
使用者頭像:${user.file.originalFilename} // requestScope 這裡 是可以不用寫 的 他預設會從小到大 在域裡找user
</body>
四、實作使用者下載下傳 功能 改造 我們的 download.jsp
<body>
<p>${requestScope.user.file}</p>
<h3>檔案下載下傳</h3>
<p>使用者頭像:<a href="download?filename=${requestScope.user.file.originalFilename}">下載下傳:${requestScope.user.file.originalFilename}</a></p>
</body>
4.2 然後 開始 編寫 download 控制器 注意download方法傳回的是ResponseEntity<byte[]> 類型,這個是封裝好的傳回類型,我們需要傳入byte數組、headers、HttpStatus,然後它就會傳回具體的下載下傳流,調用用戶端去下載下傳資源
//檔案下載下傳
@RequestMapping(value = "download", method = RequestMethod.GET)
public ResponseEntity<byte[]> download(HttpServletRequest request, @RequestParam("filename") String filename, Model model) throws IOException {
String downloadFilePath="E:\\project\\SpringMvcFileUpload\\WebRoot\\images";//從我們的上傳檔案夾中去取
File file = new File(downloadFilePath+File.separator+filename);//建立一個檔案
HttpHeaders headers = new HttpHeaders();//http頭資訊
String downloadFileName = new String(filename.getBytes("UTF-8"),"iso-8859-1");//設定編碼
headers.setContentDispositionFormData("attachment", downloadFileName);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//MediaType:網際網路媒介類型 contentType:具體請求中的媒體類型資訊
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
}
頁面頂部的 語句 忽略
4.3 開始測試
點選 開始下載下傳
如圖左下角 的 下載下傳完成 去檢視 控制器 下載下傳路徑的位置 檔案就已經在了
本篇博文介紹了SpringMvc上傳和檔案的功能,需要注意的地方就是對于檔案上傳包common-fileupload.jar包的使用,還有在配置檔案上配置mulitipartResolver這個bean。下面又介紹了用java 實體類去映射上傳檔案的屬性對應的檔案,這點的好處就是它會自動映射,然後把對象放入到我們的請求域中,就可以展示給界面使用者層,這也是mvc思想模式的展現。接下來是介紹去下載下傳檔案,隻需要從我們的寫入的目标位址去取出檔案,再進行responseEntity對象的封裝,就可以實作下載下傳功能
參考自 :https://www.cnblogs.com/wyq178/p/6921164.html