Java 文件上传 以及 springmvc实现文件上传

来源:互联网 发布:jsp端口更改 编辑:程序博客网 时间:2024/04/30 08:09

第一种方式
自定义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>
0 0
原创粉丝点击