Spring MVC 文件上传的示例代码

一如既往记录下常用而又容易忘记的东西,本篇博文主要针对Spring MVC是如何上传文件的。以下记录两种上传方法并针对案例进行记录。(有关spring mvc其他配置省略)

1、使用Spring MVC 上传文件必须配置文件解析器,如下:

<!-- 上传文件拦截,设置最大上传文件大小 10M=10*1024*1024(B)=10485760 bytes -->
 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <property name="maxUploadSize" value="10485760" />
  <property name="maxInMemorySize" value="10240000" />
  <property name="defaultEncoding" value="UTF-8" />
 </bean>

2、建立上传文件表单代码,其中要注意form表单中的enctype 属性,必须存在且必须为multipart/form-data。还有当form中存在button标签时,用ajax异步提交表单后,也面会被刷新。原因:button 存在时会再次提交一下表单,所以页面被刷新了。

<!--
  enctype 属性值:
    1、application/x-www-form-urlencoded 在发送前编码所有字符(默认)
    2、multipart/form-data 不对字符编码。 在使用包含文件上传控件的表单时,必须使用该值。
    3、text/plain 空格转换为 "+" 加号,但不对特殊字符编码。
-->
<div class="row">
  <form method="post" enctype="multipart/form-data" id="form1">
    <div><label>1、采用流的方式</label></div>
    <div class="col-sm-7" style="padding-left:0px">
      <div class="input-group">
        <input type="text" class="form-control" id="showFileInput1">
        <input type="file" style="display:none" name="txtFile" id="uploadFileInput1" accept="text/plain">
        <span class="input-group-addon" id="uploadFileButton1">
          <span class="glyphicon glyphicon-folder-open"></span>
          <label>浏览</label>
        </span>
      </div>
    </div>
    <div class="col-sm-5">
      <!--
                  当form中存在button标签时,用ajax异步提交表单后,也面会被刷新。(感觉很诡异)
                  原因:button 存在时会再次提交一下表单,所以页面被刷新了。(之前认为button type='submit' 时)button才有提交表单的功能。
      -->
      <a class="btn btn-default" id="submit1">上传</a>
    </div>
  </form>
</div>

3.1、使用CommonsMultipartFile接收上传文件,其中要注意的是:方法中CommonsMultipartFile对应的变量名如果不是对应表单中文件输入框<input type="file" style="display:none" name="txtFile" id="uploadFileInput1" accept="text/plain">的名称就必须加上@RequestParam("txtFile") 强制注入。

 /**
   * @Description: 通过文件流的形式上传
   * @param file  @RequestParam("txtFile") 将name=txtFile控件得到的文件封装成CommonsMultipartFile对象,
   *       如果不这样做会报CommonsMultipartFile没有初始化的错误
   *       java.lang.NoSuchMethodException: org.springframework.web.multipart.commons.CommonsMultipartFile.<init>()
   * @return
   * @author yuanfy
   * @date 2017年9月15日 下午4:36:11
   * @version 6.5
   */
  @RequestMapping(value="test/upload1")
  @ResponseBody
  public String testUpload1(@RequestParam("txtFile")CommonsMultipartFile file){
    Long times = System.currentTimeMillis();
    if (file == null) {
      return null;
    }
    StringBuilder fileContent = new StringBuilder();
    //1、获取文件信息
    FileUtils.getFileInfo(file, fileContent);

    //2、上传文件并获取文件内容
    try {
      file.transferTo(new File("F:\\text.log"));//另存文件
      fileContent.append(FileUtils.getFileContentByLine(file.getInputStream()));
    }
    catch (IOException e) {
      return "获取文件内容失败";
    }

    //3、返回文件信息和内容
    String content = fileContent.toString();
    content = content.replace("times", (System.currentTimeMillis()-times) + "ms");
    return content;
  }

界面效果图如下:

3.2、使用CommonsMultipartResolver获取存放文件对象,拿到文件对象后遍历每个文件上传及获取相关的内容。

@RequestMapping(value="test/upload2")
  @ResponseBody
  public String testUpload2(HttpServletRequest request){
    Long times = System.currentTimeMillis();
    StringBuilder fileContent = new StringBuilder();
    //1.根据servletContext获取多文件上传解析组件
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
    if (!multipartResolver.isMultipart(request)) {
      return "不是上传文件表单,请检查表单属性";
    }
    //2.将请求对象转换为多文件请求对象。
    MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
    //3、根据多文件请求对象获取文件存放Map
    Map<String, MultipartFile> fileMap = multipartHttpServletRequest.getFileMap();
    Iterator<Entry<String, MultipartFile>> iterator = fileMap.entrySet().iterator();
    //4、迭代文件Map,获取具体的MultipartFile
    while (iterator.hasNext()) {
      Entry<String, MultipartFile> entry = iterator.next();
      MultipartFile multipartFile = entry.getValue();
      //获取文件头信息
      FileUtils.getFileInfo(multipartFile, fileContent);
      try {
        //上传文件
        multipartFile.transferTo(new File("F:\\text.log"));
        //获取文件内容
        fileContent.append(FileUtils.getFileContentByLine(multipartFile.getInputStream()));
      }catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
    //5、返回文件信息和内容
    String content = fileContent.toString();
    content = content.replace("times", (System.currentTimeMillis()-times) + "ms");
    return content;
  }

其中第一步获取文件解析器对象应该都清楚只要在容器中配置了对应的对象我们就可以获取到它,而它有根据上下文获取的构造函数就方便多了。

/**
   * Constructor for standalone usage. Determines the servlet container's
   * temporary directory via the given ServletContext.
   * @param servletContext the ServletContext to use
   */
  public CommonsMultipartResolver(ServletContext servletContext) {
    this();
    setServletContext(servletContext);
  }

然后根据request判断是否还有上传文件的表单,如果不是肯定直接返回,我们看看源码中是怎么判断的。

//CommonsMultipartResolver.class 主要判断request是否为空
@Override
public boolean isMultipart(HttpServletRequest request) {
  return (request != null && ServletFileUpload.isMultipartContent(request));
}
//ServletFileUpload 主要判断是否是post方法,因为上传文件必须是post提交,其实我们可以在我们自定义controller中的方法指定访问
public static final boolean isMultipartContent(HttpServletRequest request) {
  if (!POST_METHOD.equalsIgnoreCase(request.getMethod())) {
      return false;
    }
    return FileUploadBase.isMultipartContent(new ServletRequestContext(request));
}
//FileUploadBase.class 如果请求是MULTIPART 则返回true
public static final boolean isMultipartContent(RequestContext ctx) {
    String contentType = ctx.getContentType();//类似:multipart/form-data; boundary=----WebKitFormBoundaryLF3eM94lDB0ocQxT
    if (contentType == null) {
      return false;
    }
    if (contentType.toLowerCase(Locale.ENGLISH).startsWith(MULTIPART)) {
      return true;
    }
    return false;
}

所以如果request是上传文件的请求对象,则进行第二步。将request转换成多文件请求对象,然后获取存放文件的map。

可想而知这种方法效率是比第一种要低的,因为他要遍历文件map,但是在Spring MVC常用的却是这种方法。

效果图如下:

其中FileUtils.java代码如下:

package com.yuanfy.monitorsite.common.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import org.springframework.web.multipart.MultipartFile;

/**
 * @Description: 文件工具类方法
 * @author yuanfy
 * @date 2017年9月15日 下午2:45:40
 * @version 1.0
 */
public class FileUtils {
  /**
   * @Description: 获取文件信息
   * @param file CommonsMultipartFile类型的文件
   * @param fileContent StringBuilder,封装文件信息
   * @author yuanfy
   * @date 2017年9月15日 下午2:51:34
   * @version 1.0
   */
  public static void getFileInfo(MultipartFile file, StringBuilder fileContent) {
    fileContent.append("文件名称:\t\t").append(file.getName()).append("\n")
      .append("文件原始名称:\t").append(file.getOriginalFilename()).append("\n")
      .append("文件大小:\t\t").append(file.getSize()).append("\n")
      .append("文件类型:\t\t").append(file.getContentType()).append("\n")
      .append("读取文件时长:\t times").append("\n");
  }

  /**
   * @Description: 根据文件对象获取文件内容
   * @param file
   * @author yuanfy
   * @date 2017年9月15日 下午5:01:57
   * @version 1.0
   * @throws IOException
   * @throws FileNotFoundException
   */
  public static String getFileContentByLine(File file) throws FileNotFoundException, IOException {
    return getFileContentByLine(new FileInputStream(file));
  }
  /**
   * @Description: 根据文件输入流对象获取文件内容
   * @param in 文件输入流对象
   * @author yuanfy
   * @date 2017年9月15日 下午5:01:57
   * @version 1.0
   * @throws IOException
   */
  public static String getFileContentByLine(InputStream in) throws IOException {
    StringBuilder fileContent = new StringBuilder();

    byte[] bytes = new byte[1024];
    int len = 0;
    while ((len = in.read(bytes)) != -1) {
      String content = new String(bytes, 0, len, "UTF-8");
      fileContent.append(content);
    }
    StreamUtils.close(in);
    return fileContent.toString();
  }
}

当然要想查看整个代码,可以访问我项目的整个代码:https://github.com/YuanFY/blog_demo

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SpringMVC文件上传的配置实例详解

    记述一下步骤以备查. 准备工作: 需要把Jakarta Commons FileUpload及Jakarta Commons io的包放lib里. 我这边的包是: commons-fileupload-1.1.1.jar commons-io-1.3.2.jar 然后在spring-servlet.xml进行multipartResolver配置,不配置好上传会不好用. <bean id="multipartResolver" class="org.springfram

  • springMVC实现前台带进度条文件上传的示例代码

    项目框架采用spring+hibernate+springMVC如果上传文件不想使用flash那么你可以采用HTML5;截图前段模块是bootstarp框架;不废话直接来代码;spring-mvc配置文件;效果截图如下: 详细实现如下: 1.mvc-config.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/s

  • Spring MVC中上传文件实例

    SpringMVC(注解)上传文件需要注意的几个地方: 1.form的enctype="multipart/form-data",这个是上传文件必须的 2.applicationContext.xml配置: 复制代码 代码如下: <!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 --> <bean id="multipartResolver" class="org.springframework.w

  • spring mvc实现文件上传并携带其他参数的示例

    这是主要使用到的jar 文件是:spring mvc +apache common-fileuplad 第一步:web.xml 文件.[重点是spring mvc的拦截器和相关监听器] <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi

  • SpringMVC上传文件的三种实现方式

    SpringMVC上传文件的三种实现方式,直接上代码吧,大伙一看便知 前台: <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.

  • springMVC结合AjaxForm上传文件

    最近在项目中需要上传文件文件,之前一直都是form提交的,尝试了一下AjaxForm,感觉还比较好用,写篇随笔mark下,供以后使用. 准备工作: 下载jquery-form.js 相关jar: commons-fileupload-1.1.1.jar commons-io-1.3.2.jar 在spring-servlet.xml进行multipartResolver配置: <bean id="multipartResolver" class="org.springf

  • SpringMVC文件上传 多文件上传实例

    必须明确告诉DispatcherServlet如何处理MultipartRequest.SpringMVC中提供了文件上传使用方式如下配置xxx-servlet.xml,添加如下代码: 复制代码 代码如下: <bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">          <!-- 设置

  • springMVC配置环境实现文件上传和下载

    最近的项目中用到了文件的上传和下载功能,我觉着这个功能比较重要,因此特意把它提取出来自己进行了尝试. 下面就是springMVC配置环境实现文件上传和下载的具体步骤,供大家参考,具体内容如下 一. 基础配置: maven导包及配置pom.xml,导包时除开springmvc的基础依赖外,需要导入文件上传下载时用到的commons-io.jsr和commons-fileupload.jar: <project xmlns="http://maven.apache.org/POM/4.0.0&

  • 在SpringMVC框架下实现文件的上传和下载示例

    在eclipse中的javaEE环境下:导入必要的架包 web.xml的配置文件: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation=&

  • Spring MVC 文件上传的示例代码

    一如既往记录下常用而又容易忘记的东西,本篇博文主要针对Spring MVC是如何上传文件的.以下记录两种上传方法并针对案例进行记录.(有关spring mvc其他配置省略) 1.使用Spring MVC 上传文件必须配置文件解析器,如下: <!-- 上传文件拦截,设置最大上传文件大小 10M=10*1024*1024(B)=10485760 bytes --> <bean id="multipartResolver" class="org.springfra

  • Spring MVC文件上传大小和类型限制以及超大文件上传bug问题

    在上一篇文章中,主要介绍了Spirng MVC环境下的正常情况下文件上传功能实现.在实际开发的时候,还会涉及到上传文件大小和类型的限制,接下来就会对Spirng MVC环境下文件上传大小和类型的限制进行介绍,还会讲解到文件上传大小tomcat服务器bug问题及解决方案. 一.文件上传大小限制 这里还是接着上篇文章先介绍Spring MVC下的文件上传大小限制,文件上传大小的限制在springmvc-config.xml中配置文件解析器CommonsMultipartResolver时即可配置,示

  • Spring MVC 文件上传下载的实例

    Spring MVC 文件上传下载,具体如下: (1) 导入jar包:ant.jar.commons-fileupload.jar.connom-io.jar. (2) 在src/context/dispatcher.xml中添加 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEnc

  • vue中实现图片和文件上传的示例代码

    html页面 <input type="file" value="" id="file" @change='onUpload'>//注意不能带括号 js代码 methods: { //上传图片 onUpload(e){ var formData = new FormData(); f ormData.append('file', e.target.files[0]); formData.append('type', 'test');

  • Java实现一个简单的文件上传案例示例代码

    Java实现一个简单的文件上传案例 实现流程: 1.客户端从硬盘读取文件数据到程序中 2.客户端输出流,写出文件到服务端 3.服务端输出流,读取文件数据到服务端中 4.输出流,写出文件数据到服务器硬盘中 下面上代码 上传单个文件 服务器端 package FileUpload; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.Serve

  • SpringBoot整合腾讯云COS对象存储实现文件上传的示例代码

    目录 1.开通腾讯云对象存储服务 2.创建存储桶 3.密钥管理,新建密钥 4.yml配置密钥.COS信息 5.COSConfig配置类 6.COS文件上传工具类 7.Controller测试上传接口: 8.PostMan接口调用 9.浏览器预览效果 企业级项目开发中都会有文件.图片.视频等文件上传并能够访问的场景,对于初学者Demo可能会直接存储在应用服务器上:对于传统项目可能会单独搭建FastDFS.MinIO等文件服务来实现存储,这种方案可能对于企业成本较小,但缺点也是很多,例如:1.增加技

  • Vue+NodeJS实现大文件上传的示例代码

    目录 整体思路 项目演示 前端界面 文件切片 hash计算 查询切片状态 切片上传(断点续传) 文件总体上传进度 合并文件 优化 请求并发数控制 hash值计算优化 常见的文件上传方式可能就是new一个FormData,把文件append进去以后post给后端就可以了.但如果采用这种方式来上传大文件就很容易产生上传超时的问题,而且一旦失败还得从新开始,在漫长的等待过程中用户还不能刷新浏览器,不然前功尽弃.因此这类问题一般都是通过切片上传. 整体思路 将文件切成多个小文件 hash计算,需要计算一

  • GO语言实现文件上传的示例代码

    目录 前言 文件上传 表单操作 服务端操作 流程实现 小结 前言 最近在写一个文件上传的功能,现在来进行整理总结一下go语言如何上传文件的,本文主要分享一下golang实现文件上传的流程和具体代码,供大家参考,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助. 文件上传 表单操作 要使表单能够上传文件,需要添加form的enctype属性enctype="multipart/form-data",upload.html代码如下: <html> <head> &

  • Spring mvc文件上传下载代码实例

    简介 文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作.如果想使用Spring的文件上传功能,则需要在上下文中配置MultipartResolver. 前端表单要求:为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data.只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给

  • java接收ios文件上传的示例代码

    本文实例为大家分享了java如何接收ios文件上传的具体代码,供大家参考,具体内容如下 ios Multipart/form-data POST请求java后台spring接口一直出错,搞了两天,终于解决了,积累下来 package com.xx.controller; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Iterator

随机推荐