springmvc文件上傳和下載

一:單文件上傳

因爲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>

注意點:

  1. 請求方式必須是post,enctype必須等於multipart/form-data(get 請求或者不設置enctype只能將文件名傳給服務器)
  2. ,type必須file,而且name屬性值,要和Multipart xxx的形參名一致!
  3. 要想在頁面中使用EL,加上isELIgnored=“false” 指令!
  4. 因爲該頁面存在一個圖片,請求該頁面的時候,該頁面也會發送一個請求,去請求圖片,而如果不去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體驗下載!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章