springMVC文件上传
增加上传组件依赖:
In the case of the CommonsMultipartResolver
, you need to use commons-fileupload.jar
.
apache-commons-io.jar
apache-commons-fileupload.jar
<!-- fileupload --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3</version> </dependency>
配置文件上传相关配置,springMVC.xml配置如下:
<?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:p="http://www.springframework.org/schema/p" 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"> <!-- 自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter --> <!-- 两个bean 是spring MVC为@Controllers分发请求所必须的 --> <mvc:annotation-driven/> <!-- 配置需要被扫描的包 --> <context:component-scan base-package="com.gc.springmvc.controller"/> <!-- 配置对静态资源文件的访问不被过滤 WebContent/resources目录中的文件都能访问 --> <mvc:resources location="/resources/" mapping="/resources/**"/> <!-- 配置返回的数据如何呈现:前缀+逻辑视图+后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <!-- 文件上传 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- Default is ISO-8859-1 --> <property name="defaultEncoding" value="UTF-8"/> <!-- Default is 10240 --> <property name="maxInMemorySize" value="10240"/> <!-- -1 indicates no limit (the default) --> <property name="maxUploadSize" value="100000"/> <!-- javax.servlet.context.tempdir(the default) 临时文件存放目录,不是最终目录!--> <property name="uploadTempDir" value="/tempdir"/> </bean> </beans>
上传页面
<form action="fileupload" method="post" enctype="multipart/form-data">
文件名称:
<input type="text" name="name"/> <br/>
选择文件:
<input type="file" name="file"/> <br/>
<input type="submit"/>
</form>
上传控制器
package com.gc.springmvc.controller;
import java.io.File;
import java.util.Date;
import javax.servlet.ServletContext;
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.context.ServletContextAware;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Controller
public class FileUploadController implements ServletContextAware{
private ServletContext servletContext;
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
/**
* 文件上传
* @param assignedName 为文件指定新的名称
* @param file 上传的文件
* @return
*/
@RequestMapping(value={"fileupload"}, method=RequestMethod.POST)
public String fileupload(@RequestParam("name")String assignedName,@RequestParam("file")CommonsMultipartFile file) {
String viewName = "uploadSuccess";
if(!file.isEmpty()) {
//通过servletContext获取到文件的绝对路径
String realPath = servletContext.getRealPath("/upload");
System.out.println("文件被保存到:"+realPath);
System.out.println("指定的名称:"+assignedName);
String originalFileName = file.getOriginalFilename();
System.out.println("原始名称:"+originalFileName);
String fileType = originalFileName.substring(originalFileName.lastIndexOf("."));
System.out.println("文件类型:"+fileType);
File targetFile = new File(realPath, assignedName+"-"+new Date().getTime()+fileType);
try {
file.getFileItem().write(targetFile);
} catch (Exception e) {
e.printStackTrace();
viewName = "uploadFailure";
};
}
//重定向
return InternalResourceViewResolver.REDIRECT_URL_PREFIX+viewName;
}
/**
* 返回成功视图
*/
@RequestMapping(value="uploadSuccess")
public String uploadSuccess() {
return "uploadSuccess";
}
/**
* 返回失败视图
*/
@RequestMapping("uploadFailure")
public String uploadFailure() {
return "uploadFailure";
}
}