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

第一种方式
自定义servlet实现文件上传和下载(基本还是以字节流进行文件上传下载)
http://www.cnblogs.com/xdp-gacl/p/4200090.html

引入commons-io包

<dependency>
    <groupId>commons-iogroupId>
    <artifactId>commons-ioartifactId>
    <version>2.4version>
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>SpringMVCservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:spring/applicationContext-springMvc.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
<async-supported>trueasync-supported>
servlet>
<servlet-mapping>
<servlet-name>SpringMVCservlet-name>

<url-pattern>*.htmurl-pattern>
servlet-mapping>

2 applicationContext-springMvc.xml引入springmvc上传组件包 CommonsMultipartResolver ,可以通过spring ICO动态注入到程序中,(注意:视图解析以及注解扫描也是在这里配置)
查看源码 ,发现 CommonsMultipartResolver该类实现了ServletContextAware接口,对于实现了该接口的类都可以获取ServletContext
同时他也继承了CommonsFileUploadSupport,该类也是通过commons-io包,利用org.apache.commons.fileupload对文件上传的进行实现


<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">
    
    
    <context:component-scan base-package="com.youmeek.ssm.**.controller"/>
    
    <mvc:annotation-driven/>
    
    
    <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/"/>
        <property name="suffix" value=".jsp"/>
        <property name="contentType" value="text/html;charset=utf-8"/>
    bean>
    
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        
        <property name="defaultEncoding" value="UTF-8"/>
        
        <property name="maxUploadSize" value="10485760"/>
        
        <property name="maxInMemorySize" value="4096"/>
    bean>
    
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 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"%>

<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>

你可能感兴趣的:(Java,io,上传)