一:單文件上傳
因爲spring mvc的上傳,底層還是依賴commons-io.jar,commons-upload.jar,所以使用之前先引入pom依賴
1、pom依賴
<!--引入上傳組件-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
2、頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/upload/upload" method="post" enctype="multipart/form-data">
上傳文件: <input type="file" name="img">
<input type="submit" value="提交">
</form>
<img src="${img}"/>
</body>
</html>
注意點:
- 請求方式必須是post,enctype必須等於multipart/form-data(get 請求或者不設置enctype只能將文件名傳給服務器)
- ,type必須file,而且name屬性值,要和Multipart xxx的形參名一致!
- 要想在頁面中使用EL,加上isELIgnored=“false” 指令!
- 因爲該頁面存在一個圖片,請求該頁面的時候,該頁面也會發送一個請求,去請求圖片,而如果不去web.xml中配置的話,spring mvc默認會將它交給DispatcherServlet來處理,通過HandlerMapping
去獲取Handler,因爲不存在該Handler的映射,所以到時候會報錯!!,所以對圖片這個靜態資源需要在
web.xml中配置一下
web.xml
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
3、Handler
@Controller
@RequestMapping("/upload")
public class UploadController {
@PostMapping("/upload")
public String upload(MultipartFile img, HttpServletRequest reqeust){
if(img.getSize()>0){
//1.獲取保存上傳文件的路徑!
String path = reqeust.getSession().getServletContext().getRealPath("upload");
//2.獲取上傳的文件名
String fileName = img.getOriginalFilename();
File file = new File(path,fileName);
try {
img.transferTo(file);
/*存到request域,在upload.jsp中顯示出來!*/
reqeust.setAttribute("img","/upload/"+fileName);
} catch (IOException e) {
e.printStackTrace();
}
}
return "upload";
}
}
注意點:
獲取的upload文件夾必須存在:F:\Software\tomcat\apache-tomcat-8.5.39\webapps\ROOT\upload
它是在ROOT目錄下創建的,並且tomcat每次啓動完,我們手動創建的upload文件夾就會消失,所以每次都得手動創建一個
注:到Handler後還不行,還得在配置文件中配置CommonsMultipartResolver才行!
4、spring mvc.xml
<!-- 配置上傳組件 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
二:多文件上傳
跟單文件上傳差不多
1、頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/upload/uploads" method="post" enctype="multipart/form-data">
文件1: <input type="file" name="imgs"><br/>
文件2: <input type="file" name="imgs"><br/>
文件3: <input type="file" name="imgs"><br/>
<input type="submit" value="提交">
</form>
<c:forEach items="${files}" var="file">
<img src="${file}" width="300px">
</c:forEach>
</body>
</html>
1.由於使用了jstl需要導入pom依賴
2.注意name屬性值必須和形參名字一模一樣!
jstl
<!--引入jstl-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
2、Handler
@PostMapping("/uploads")
public String uploads(MultipartFile[] imgs, HttpServletRequest request){
List<String> files = new ArrayList<>();
for(MultipartFile img : imgs){
if(img.getSize()>0){
//1.獲取存放上傳文件的路徑
String path = request.getSession().getServletContext().getRealPath("upload");
String name = img.getOriginalFilename();
File destfile = new File(path,name);
try {
img.transferTo(destfile);
files.add("/upload/"+name);
} catch (IOException e) {
e.printStackTrace();
}
}
}
request.setAttribute("files",files);
return "uploads";
}
三:文件下載
1、頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="/file/download/1">1.png</a>
<a href="/file/download/2">2.png</a>
<a href="/file/download/3">3.png</a>
</body>
</html>
2、Handler
@Controller
@RequestMapping("/file")
public class DownloadController {
@GetMapping("/download/{name}")
public void download(@PathVariable("name") String name, HttpServletRequest reqeust, HttpServletResponse response){
if(name != null) {
name += ".png";
String path = reqeust.getSession().getServletContext().getRealPath("upload");
File file = new File(path, name);
OutputStream outputStream = null;
if (file.exists()) {
response.setContentType("application/forc-download");
response.setHeader("Content-Disposition","attachment;filename="+name);
try {
outputStream = response.getOutputStream();
//將文件轉換成字節數組!
outputStream.write(FileUtils.readFileToByteArray(file));
outputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (outputStream!=null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
}
注:你可以先用uploads.jsp頁面上傳,然後在來用download.jsp體驗下載!