Spring MVC文件上傳


Spring MVC為文件上傳提供了直接的支持,這種支持是通過即插即用的MultipartResolver實現的。Spring使用Jakarta Commons FileUpload 技術實現了一個MultipartResolver實現類:CommonsMultipartResolver。

Spring MVC上下文中默認沒有裝配MultipartResolver,因此默認情況下不能處理文件的上傳工作。如果想要使用Spring的文件上傳功能,需要先在上下文中配置MultipartResolver。

第一步:配置MultipartResolver

使用CommonsMultipartResolver配置一個MultipartResolver解析器:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="UTF-8" p:maxUploadSize="5242880" p:uploadTempDir="upload/temp"
        />

defaultEncoding必須和用戶JSP的pageEncoding屬性一致,以便正確讀取表單的內容。uploadTempDir是文件上傳過程所使用的臨時目錄,文件上傳完成后,臨時目錄中的臨時文件會被自動清除。

第二步:編寫文件上傳表單頁面和控制器

JSP頁面如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
  </head>
  <body>
    <h1>選擇上傳文件</h1>
    <form action="<%=basePath%>user/upload.do" method="post" enctype="multipart/form-data">
        文件名:<input type="text" name="name" /><br/>
        <input type="file" name="file" /><br/>
        <input type="submit" />
    </form>
  </body>
</html>

注意:負責上傳的表單和一般表單有一些區別,表單的編碼類型必須是"Multipart/form-data"

控制器UserController如下:

package com.web;

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

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
@Controller
@RequestMapping(value = "/user")
public class UserController {
    @RequestMapping(value = "/upload.do")
    public String updateThumb(@RequestParam("name") String name,
            @RequestParam("file") MultipartFile file)
            throws IllegalStateException, IOException {
        if (!file.isEmpty()) {
            file.transferTo(new File("d:/temp/"
                    + name
                    + file.getOriginalFilename().substring(
                            file.getOriginalFilename().lastIndexOf("."))));
            return "redirect:success.html";
        } else {
            return "redirect:fail.html";
        }
    }
}

Spring MVC會將上傳文件綁定到MultipartFile對象中。MultipartFile提供了獲取上傳文件內容、文件名等內容,通過transferTo方法還可將文件存儲到硬件中,具體說明如下:

  1. byte[] getBytes() :獲取文件數據 
  2. String getContentType():獲取文件MIME類型,如image/pjpeg、text/plain等
  3. InputStream getInputStream():獲取文件流
  4. String getName():獲取表單中文件組件的名字
  5. String getOriginalFilename():獲取上傳文件的原名
  6. long getSize():獲取文件的字節大小,單位為byte
  7. boolean isEmpty():是否有上傳的文件
  8. void transferTo(File dest):可以使用該文件將上傳文件保存到一個目標文件中

源碼:uploadtest.zip

 


免責聲明!

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



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