文件的上傳
SpringMVC爲文件上傳提供了直接的支持,這種支持是通過MultipartResolver
實現的,其中有一個其實現類:CommonsMultipartResovler
。
SpringMVC上下文中默認沒有裝配MultipartResolver
,因此默認情況下不能處理文件的上傳工作,如果想使用SpringMVC的文件上傳功能,需在上下文中配置MultipartResolver
。
配置MultipartResolver
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<property name="maxUploadSize" value="1024000"/>
</bean>
defaultEncoding
:必須和用戶JSP的pageEncoding
屬性一致,以便正確解析表單的內容。
爲了讓CommonsMultipartResovler
正確工作,必須先將Jakarta Commons FileUplo及Jakarta Commons io的類包添加到類路徑下。
示例:做一個文件上傳的Demo
- 表單如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="testFileUpload" method="post" enctype="multipart/form-data">
File : <input type="file" name="file" />
Desc : <input type="text" name="desc" />
<input type="submit" value="submit" />
</form>
</body>
</html>
- 配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 配置自動掃描的包-->
<context:component-scan base-package="com.cerr.springmvc"/>
<!-- 配置視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/webViews/"/>
<property name="suffix" value=".jsp"/>
</bean>
<mvc:default-servlet-handler/>
<mvc:annotation-driven />
<!-- 配置CommonsMultipartResolver -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<property name="maxUploadSize" value="1024000"/>
</bean>
</beans>
- 控制器編寫的方法如下:
package com.cerr.springmvc.test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpRequest;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.*;
import java.util.Collection;
import java.util.Date;
import java.util.Locale;
@Controller
public class SpringMVCTest1 {
@Autowired
private HttpServletRequest request;
//上傳文件
@RequestMapping(value = "/testFileUpload")
public String testFileUpload(@RequestParam("desc") String desc,
@RequestParam("file")MultipartFile file) throws IOException {
// System.out.println("desc:"+desc);
// System.out.println("OriginalFilename:"+file.getOriginalFilename());
// System.out.println("InputStream:"+file.getInputStream());
//獲取文件名
String fileName = file.getOriginalFilename();
//獲取其在web服務器中路徑
String path = request.getServletContext().getRealPath("/files");
//創建文件
File newFile = new File(path,fileName);
if (!newFile.exists()){
newFile.createNewFile();
}
//輸出流
FileOutputStream outputStream = new FileOutputStream(newFile);
//輸入流
InputStream inputStream = file.getInputStream();
byte [] f = new byte[1024];
try{
while(inputStream.read(f) != -1){
outputStream.write(f);
}
inputStream.close();
outputStream.close();
}catch (IOException e){
e.printStackTrace();
}
//System.out.println(path);
return "success";
}
}
上傳後訪問的jsp頁面爲空模板頁面,這裏就不給代碼了。