springmvc中使用文件上傳功能


項目代碼:https://github.com/PeiranZhang/springmvc-fileupload

Servlet3.0之前使用文件上傳功能

Servlet3.0之前需要使用commons file upload和commons io組件,依賴一下了兩個jar

  • commons-fileupload-1.3.jar
  • commons-io-2.4.jar

spring配置文件中配置bean

    <!--Servlet 3.0之前,需要定義CommonsMultipartResolver來支持文件上傳功能,bean id固定為"multipartResolver"-->        
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--定義上傳文件最大為1KB-->
    <property name="maxUploadSize" value="1000000"/>
    <property name="uploadTempDir" value="file:E://tmp"/>
    <property name="defaultEncoding" value="UTF-8"/>
    </bean>

文件上傳jsp編寫

下面代碼中,指定了enctype,同時使用了多個文件上傳,name="files"。另外,form表單中也可以使用其他的文本框。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件上傳</title>
</head>
<body>
<!--需要指定enctype="multipart/form-data",才能使用文件上傳功能-->
<form action="save_file" method="post" enctype="multipart/form-data" >
    <table>
        <tr>
            <td>Select a file to upload</td>
            <td><input type="file" name="files" /></td>
        </tr>
        <tr>
            <td>Select a file to upload</td>
            <td><input type="file" name="files" /></td>
        </tr>
        <tr>
            <td>Name</td>
            <td><input type="text" name="name" /></td>
        </tr>
        <tr>
            <td>Email</td>
            <td><input type="text" name="email" /></td>
        </tr>
        <tr>
            <td><input type="submit" value="Submit" /></td>
        </tr>
    </table>
</form>
</body>
</html

Contorller處理代碼

@Controller
public class UploadFileController {
@RequestMapping(value = "/upload_file")
public String uploadFile(){
    return "uploadFile";
}

@RequestMapping(value = "/save_file")
/**
 * 多個文件上傳,對應需要MultipartFile[]數組,否則不需要數組
 */
public String saveFile(@RequestParam("files")MultipartFile[] files,
                       @RequestParam("name") String name,
                       HttpServletRequest request,Model model){
    //保存文件
    if(files != null && files.length > 0){
        for(MultipartFile file : files){
            String fileName = file.getOriginalFilename();
            String dir = "E://test";
            File saveFile = new File(dir,fileName);
            try {
                //文件保存到本地
                file.transferTo(saveFile);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
    //顯示添加請求對象,在fileLists.jsp重可以使用EL表達式訪問對象,即${files}
    request.setAttribute("files",files);
    request.setAttribute("name",name);
    //也可以不添加對象,在fileLists.jsp總可以直接使用EL隱式對象param來訪問,即${param.email}來訪問
    //request.setAttribute("email",email);

    //使用Model添加,為啥在jsp中訪問不到?
    //model.addAttribute(files);
    //model.addAttribute(name);
    return "fileLists";
}
}

Controller中處理方法使用@RequestParam注解接受請求中的參數,傳遞給處理方法參數,使用MultipartFile數組參數接收上傳的文件。另外,可以通過在參數中定義HttpServletRequest對象來獲得原始的請求對象,然后調用request.setAttribute方法設置視圖對象,在返回的jsp視圖中通過EL表達式引用這些對象,EL表達式中提供了一些隱式對象,例如param,這是一個包含所有請求參數,並用參數名作為key的Map,通過param隱式對象,可以直接訪問某一個請求參數。具體訪問方式見代碼中注解部分。

fileLists.jsp代碼

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<html>
<head>
    <title>File List</title>
</head>
<body>
<table>
    <tr>
        <td>Name:</td>
        <td>${name}</td>
    </tr>
    <tr>
        <td>Email</td>
        <td>${param.email}</td>
    </tr>
    <c:forEach items="${files}" var="file">
        <tr>
            <td>OriginalFileName:</td>
            <td>${file.originalFilename}</td>
        </tr>
        <tr>
            <td>Type:</td>
            <td>${file.contentType}</td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

fileLists.jsp中通過EL表達式來訪問對象,包含param隱式對象和controller中添加的files對象,該對象為MultipartFile數組

Servlet3.0及3.0之后使用文件上傳功能

有了Servlet 3.0,就不需要Commons FileUpload和Commons IO元件了。在Servlet 3.0及其以上版本的容器中進行服務器端文件上傳的編程,是圍繞着注解類型MultipartConfig和javax. servlet.http.Part接口進行的。處理已上傳文件的Servlets必須以@MultipartConfig進行注解。Spring MVC的DispatcherServlet處理大部分或者所有請求。如果不修改源代碼,將無法對Servlet進行注解。但值得慶幸的是,Servlet 3.0中有一種比較容易的方法,能使一個Servlet變成一個MultipartConfig Servlet,即給部署描述符(web.xml)中的Servlet聲明賦值。在web.xml中添加multipart-config標簽與用@MultipartConfig給DispatcherServlet進行注解的效果一樣。

web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!-- 配置前端控制器 -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <!-- contextConfigLocation配置springmvc加載的配置文件適配器、處理映射器等-->
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/config/springmvc-config.xml</param-value>
        </init-param>
        <!--值不為0表示,tomcat啟動該應用時,加載servlet,而不是等到第一請求到來時再加載servlet-->
        <load-on-startup>1</load-on-startup>
        <multipart-config>
            <!--臨時目錄,需要目錄存在,否則報錯-->
            <location>E:\\tmp</location>
            <max-file-size>20848820</max-file-size>
            <max-request-size>418018841</max-request-size>
            <!--上傳文件超出這個容量界限時,會被寫入磁盤。-->
            <file-size-threshold>1048576</file-size-threshold>
        </multipart-config>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!-- 所有訪問都由DispatcherServlet進行解析-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    </web-app>

spring配置文件中,配置multipartResolver

<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"></bean>

結果

文件上傳

顯示

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM