SpringMVC05_文件上傳和下載
單文件上傳
- 添加兩個文件上傳需要的依賴:
<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.4</version>
</dependency>
- upload.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/file/upload" method="post" enctype="multipart/form-data">
<input type="file" name="img"/>
<input type="submit" value="上傳"/>
</form>
<img src="${path}">
</body>
</html>
- FileHandler
package com.blu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
@Controller
@RequestMapping("/file")
public class FileHandler {
@PostMapping("/upload")
public String upload(MultipartFile img, HttpServletRequest request) {
if (img.getSize() > 0) {
String path = request.getServletContext().getRealPath("file");
System.out.println(path);
String name = img.getOriginalFilename();
File file = new File(path, name);
try {
//把文件img的內容轉給file
img.transferTo(file);
request.setAttribute("path","/file/"+name);
} catch (IOException e) {
e.printStackTrace();
}
}
return "upload";
}
}
- 配置文件中添加文件上傳組件:
<!-- 配置文件上傳組件 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
-
運行測試(訪問http://localhost:8080/upload.jsp打開文件上傳頁面,選擇一個jpg文件上傳)
-
控制檯打印:
C:\apache-tomcat-9.0.31-windows-x64\apache-tomcat-9.0.31\webapps\ROOT\file
在該路徑下出現了自己上傳的圖片,但頁面無法正常顯示:
解決辦法:在web.xml中添加對.jpg靜態資源文件的忽略處理即可
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
- 修改後重新運行,上傳後的圖片可正常顯示:
多文件上傳
- 添加以下兩個依賴以支持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>
- 多文件上傳頁面uploads.jsp:
<%@ 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="/file/uploads" method="post" enctype="multipart/form-data">
file1:<input type="file" name="imgs"/><br/>
file2:<input type="file" name="imgs"/><br/>
file3:<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>
- Handler
@PostMapping("/uploads")
public String uploads(MultipartFile[] imgs, HttpServletRequest request){
List<String> files = new ArrayList<>();
for (MultipartFile img:imgs){
if (img.getSize() > 0) {
String path = request.getServletContext().getRealPath("file");
System.out.println(path);
String name = img.getOriginalFilename();
File file = new File(path, name);
try {
img.transferTo(file);
files.add("/file/"+name);
} catch (IOException e) {
e.printStackTrace();
}
}
}
request.setAttribute("files",files);
return "uploads";
}
- 測試(訪問http://localhost:8080/uploads.jsp,上傳三張圖片)
- 頁面顯示:
- C:\apache-tomcat-9.0.31-windows-x64\apache-tomcat-9.0.31\webapps\ROOT\file 目錄:
文件下載
- 首先上傳三張.jpg格式的圖片:
- download.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="/file/download/1">1.jpg</a><br>
<a href="/file/download/2">2.jpg</a><br>
<a href="/file/download/3">3.jpg</a>
</body>
</html>
- Handler
@GetMapping("/download/{name}")
public void download(@PathVariable("name") String name, HttpServletRequest request, HttpServletResponse response){
if (name != null){
name += ".jpg";
String path = request.getServletContext().getRealPath("file");
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 (IOException e) {
e.printStackTrace();
} finally {
if (outputStream != null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}