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

这篇博客介绍了两种Java文件上传的方式,一种是自定义Servlet实现,另一种是利用SpringMVC的CommonsMultipartResolver进行优化。SpringMVC的解决方案减少了IO操作,提高了效率,尤其体现在内存中数据的查找和导入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一种方式
自定义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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值