SpringMVC05_文件上傳和下載

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();
					}
				}
			}
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章