第一种方式
自定义servlet实现文件上传和下载(基本还是以字节流进行文件上传下载)
http://www.cnblogs.com/xdp-gacl/p/4200090.html
引入commons-io包
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
常用的方法
获取文件名
filename = filename.substring(filename.lastIndexOf("\\")+1);
获取扩展名
String fileExtName = filename.substring(filename.lastIndexOf(".")+1);
在文件下载是,form 设置参数
enctype="multipart/form-data"
规定上传到服务器的参数包括 文件类型 。
第二种方式
使用springMVC包装的解析器 进行文件上传
这里要用到springMvc的 CommonsMultipartResolver 包
1 在web.xml中定义springMvc servlet以及映射关系
<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:spring/applicationContext-springMvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<!-- 此处可以可以配置成 *.do ,对应struts的后缀习惯 -->
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
2 applicationContext-springMvc.xml引入springmvc上传组件包 CommonsMultipartResolver ,可以通过spring ICO动态注入到程序中,(注意:视图解析以及注解扫描也是在这里配置)
查看源码 ,发现 CommonsMultipartResolver该类实现了ServletContextAware接口,对于实现了该接口的类都可以获取ServletContext
同时他也继承了CommonsFileUploadSupport,该类也是通过commons-io包,利用org.apache.commons.fileupload对文件上传的进行实现
<?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-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--上面的xsd最好和当前使用的Spring版本号一致,如果换了Spring版本,这个最好也跟着改-->
<!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->
<context:component-scan base-package="com.youmeek.ssm.**.controller"/>
<!-- 配置注解驱动 -->
<mvc:annotation-driven/>
<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀(如果最后一个还是表示文件夹,则最后的斜杠不要漏了) 使用JSP-->
<!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用html)- -->
<bean id="viewResolver" abstract="true">
<property name="attributes">
<props>
<prop key="resRoot">${allways.cc.resRoot}</prop>
<prop key="pageTitle">${allways.cc.pageTitle}</prop>
</props>
</property>
</bean>
<bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" parent="viewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/view/"/><!--设置JSP文件的目录位置-->
<property name="suffix" value=".jsp"/>
<property name="contentType" value="text/html;charset=utf-8"/>
</bean>
<!-- 文件上传 start 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默认编码 -->
<property name="defaultEncoding" value="UTF-8"/>
<!-- 文件大小最大值 上传文件大小限制为10M,10*1024*1024 -->
<property name="maxUploadSize" value="10485760"/>
<!-- 内存中的最大值 -->
<property name="maxInMemorySize" value="4096"/>
</bean>
<!--文件上传 end-->
</beans>
3.测试代码
package com.youmeek.ssm.module.user.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
/**
* 使用SpringMvc实现文件上传
*/
@Controller
@RequestMapping("/file")
public class UploadController {
//创建一个springmvc上传文件解析器
@Autowired
CommonsMultipartResolver multipartResolver;
@RequestMapping("/upload2" )
public String upload2(HttpServletRequest request,HttpServletResponse response) throws IllegalStateException, IOException {
//判断 request 是否有文件上传,即多部分请求
if(multipartResolver.isMultipart(request)){
//转换成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request;
//取得request中的所有文件名
Iterator<String> iter = multiRequest.getFileNames();
while(iter.hasNext()){
//记录上传过程起始时的时间,用来计算上传时间
int pre = (int) System.currentTimeMillis();
//取得上传文件
MultipartFile file = multiRequest.getFile(iter.next());
if(file != null){
//取得当前上传文件的文件名称
String myFileName = file.getOriginalFilename();
//如果名称不为“”,说明该文件存在,否则说明该文件不存在
if(myFileName.trim() !=""){
System.out.println(myFileName);
//重命名上传后的文件名
String fileName = "demoUpload" + file.getOriginalFilename();
//定义上传路径
// String path = "H:/" + fileName;
String path = request.getSession().getServletContext().getRealPath("/WEB-INF/upload") + fileName;
File localFile = new File(path);
try {
file.transferTo(localFile);
} catch (IOException e) {
e.printStackTrace();
}
}
}
//记录上传该文件后的时间
int finaltime = (int) System.currentTimeMillis();
System.out.println(finaltime - pre);
}
}
return "/success";
}
}
结果:
10597
0
avaiuk.sql
使用CommonsMultipartResolver 包装器,在导入前首先会对存在在内存中的需要导入的数据进行查找,如果有则直接从内存中进行导入,从而减少IO操作。通过输出结果可以看到,该上传是对第一种的优化。
附:jsp文件
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/file/upload2.htm" enctype="multipart/form-data" method="post">
上传用户:<input type="text" name="username"><br/>
上传文件1:<input type="file" name="file1"><br/>
上传文件2:<input type="file" name="file2"><br/>
<input type="submit" value="提交">
</form>
</body>
</html>