《SpringMVC從入門到放肆》十五、SpringMVC之上傳檔案

王 二 麻 子發表於2019-06-27

上一篇我們學習了資料分組校驗,已經可以靈活的在專案中進行資料校驗了,今天來學習SpringMVC的上傳檔案功能。相對來說SpringMVC的上傳功能,還是比較簡單的。

 

一、新增依賴

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>${commons-io.version}</version>
</dependency>
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>${commons-fileupload.version}</version>
</dependency>

 

二、修改applicationContext.xml配置檔案

要想實現上傳功能,必須要配置一個解析器,如下:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize"><!-- 最大上傳檔案大小 100M -->
        <value>104857600</value>
    </property>
    <property name="maxInMemorySize"><!-- 最大上傳快取大小 4k -->
        <value>4096</value>
    </property>
</bean>

上述程式碼設定了支援最大的上傳大小為100M,如果檔案超出大小,則會報錯,會丟擲org.springframework.web.multipart.MaxUploadSizeExceededException,而這個時候,程式碼還沒有執行到我們的Controller中,所以最好再配置一個異常處理解析器。如下:

<!-- 該異常是SpringMVC在檢查上傳的檔案資訊時丟擲來的,而且此時還沒有進入到Controller方法中 -->
<bean id="exceptionResolver"
    class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <!-- 遇到MaxUploadSizeExceededException異常時,自動跳轉到XXX頁面 -->
            <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">跳轉頁面URL</prop>
        </props>
    </property>
</bean>

到這裡我們需要配置的資訊就完事了,接下來就是具體的開發了,是不是好期待呀???

 

三、編寫上傳頁面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>上傳檔案</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/upload.do" method="post" enctype="multipart/form-data">
        上傳檔案:<input type="file" name="file">
        <input type="submit" value="上傳">
    </form>
</body>
</html>

頁面比較簡陋,大家不要介意,這裡主要講解功能。

 

四、編寫上傳Controller

package cn.itechyou.upload.controller;

import java.io.File;
import java.io.IOException;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.io.FileUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

@Controller
public class TestUploadController {
    /**
     * 單檔案上傳
     * @param file
     * @param request
     * @return
     */
    @RequestMapping(value = "/upload.do")
    public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
        if (!file.isEmpty()) {
            String type = file.getOriginalFilename().substring(
                    file.getOriginalFilename().indexOf("."));// 取檔案格式字尾名
            String filename = System.currentTimeMillis() + type;// 取當前時間戳作為檔名
            String path = request.getSession().getServletContext()
                    .getRealPath("/upload/" + filename);// 存放位置
            File destFile = new File(path);
            try {
                FileUtils.copyInputStreamToFile(file.getInputStream(), destFile);// 複製臨時檔案到指定目錄下
            } catch (IOException e) {
                e.printStackTrace();
            }
            return "redirect:ok.jsp";
        } else {
            return "redirect:error.jsp";
        }
    }
    
    /**
     * 多檔案上傳
     * @param request
     * @param files
     * @return
     */
    @RequestMapping(value = "uploads", method = RequestMethod.POST)
    public String uploads(HttpServletRequest request, @RequestParam("files") MultipartFile[] files){
        StringBuilder sb = new StringBuilder();
        if(files != null && files.length > 0){
            for (MultipartFile file : files) {
                if (!file.isEmpty()) {
                    String type = file.getOriginalFilename().substring(
                            file.getOriginalFilename().indexOf("."));// 取檔案格式字尾名
                    String filename = System.currentTimeMillis() + type;// 取當前時間戳作為檔名
                    String path = request.getSession().getServletContext()
                            .getRealPath("/upload/" + filename);// 存放位置
                    File destFile = new File(path);
                    try {
                        FileUtils.copyInputStreamToFile(file.getInputStream(), destFile);// 複製臨時檔案到指定目錄下
                        sb.append("1");
                    } catch (IOException e) {
                        sb.append("0");
                        e.printStackTrace();
                    }
                } else {
                    sb.append("0");
                }
            }
        }
        //這裡做個判斷,如果上傳檔案中有上傳失敗的,則返回錯誤頁面
        if(sb.toString().contains("0")){
            return "redirect:error.jsp";
        }
        return "redirect:ok.jsp";
    }
}

到這裡檔案上傳就完事了。大家可以測試一下。這裡我就不貼上測試圖片了。

相關文章