SpringMVC之文件上傳


  上傳是web程序中常見的功能,當使用上傳時,需要把form表單中的enctype屬性改為multipart/form-data,這樣就使用了二進制進行上傳,而后台需要解析這些數據。DispatcherServlet並不能解析它,而需要委托給Spring中的MultipartResolver接口實現去解析。在Spring3.1之后,Spring內置了兩種MultipartResolver的實現:

  • CommonsMultipartResolver:使用了Jakarta Commons FileUpload來解析
  • StandardServletMultipartResolver:基於Serlvet3.0對multipart的支持

  本隨筆將對二者就行舉例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="${pageContext.request.contextPath }/user/upload" method="post" enctype="multipart/form-data">
        <input name="txt" type="text" placeholder="文本信息"><br>
        <input name="file" type="file"><br>
        <input type="submit">
    </form>
</body>
</html>

Controller代碼:

package cn.powerfully.demo.web.controller;

import java.io.IOException;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;

@Controller
@RequestMapping("user")
public class UserController {
    
    @RequestMapping(path = "upload", method = RequestMethod.GET)
    public String uploadUI(Model model) {
        return "upload";
    }

    @RequestMapping(path = "upload", method = RequestMethod.POST)
    public String upload(Model model, String txt, MultipartFile file) throws IllegalStateException, IOException {
        if (file == null) {
            model.addAttribute("msg", "上傳失敗!");
        } else {
            String msg = String.format("文本信息:%s<br>文件名:%s<br>文件大小:%d字節<br>", txt, file.getOriginalFilename(),
                    file.getSize());
       //... model.addAttribute(
"msg", msg); } return "msg"; } }

一、StandardServletMultipartResolver

  首先需要創建StandardServletMultipartResolver對象,可以在springMVC配置文件中添加如下代碼,注意一定要加上id(按id裝配)

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

  對於上傳的參數,不是在bean中配置的,而是在web.xml中的DispatcherServlet配置的:

<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <multipart-config>
        <location>/</location>
        <max-file-size>102400</max-file-size>
        <max-request-size>204800</max-request-size>
    </multipart-config>
</servlet>

  使用multipart-config節點進行配置,在multipart-config中,有四個子節點:

location 上傳文件所存放的臨時目錄。必須指定
max-file-size 文件的最大大小,單位為字節。默認沒有限制
max-request-size 請求的最大大小,單位為字節。默認沒有限制
file-size-threshold 文件大小閾值,當大於這個閾值時將寫入到磁盤,否則在內存中。默認值為0

二、CommonsMultipartResolver

  因為基於Jakarta Commons FileUpload,所以要先引入commons-fileupload

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>

  接着只需要在springMVC的配置文件中裝載Bean即可

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />

  要配置參數,只要對bean注入參數:

<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="defaultEncoding" value="utf-8" /> 
    <property name="maxUploadSize" value="1024000" />
    <property name="maxInMemorySize" value="204800" />
    <property name="uploadTempDir" value="/" />
</bean>
defaultEncoding 默認的解析編碼,默認為iso-8859-1
maxUploaadSize 上傳文件的最大大小,默認為-1(無限制)
maxInMemorySize 內存緩沖區大小,超過時寫入硬盤,默認為-1(無限制)
uploadTempDir   臨時文件目錄,默認是serlvet容器的臨時目錄

  除了以上參數,還有其他的......


免責聲明!

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



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