文档章节

spring mvc的文件上传

阿信sxq
 阿信sxq
发布于 2017/05/22 15:13
字数 801
阅读 177
收藏 1

spring mvc的文件上传需要依赖commons-io和commons-fileupload来一起实现

前提

假设关于spring mvc的依赖、配置等已经正常且可以使用,在文中不再对那一部分进行说明

依赖

使用maven进行管理,需要的依赖包括有

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.2</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.5</version>
</dependency>

配置

使用xml进行配置

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="defaultEncoding" value="UTF-8" />
    <!-- 以字节为单位设置允许上传的文件大小 -->
    <!-- 100MB -->
    <property name="maxUploadSize" value="104857600" />
    <property name="maxInMemorySize" value="1024" />
</bean>

如果使用spring-boot,就不需要这么配置了,只需要配置上传文件的大小限制就行了

#上传文件大小限制
spring.http.multipart.max-file-size = 200Mb
spring.http.multipart.max-request-size= 210Mb

这里有一点注意,在spring-boot的官方文档里面有说-1表示没有限制,但是实际使用中发现设置为-1就相当于没有设置,没有起作用

同时spring boot使用自带的tomcat容器,在tomcat集成版里面有commons-io和commons-fileupload的部分api,
但是不是完整的,所以在使用时有部分api用不了,使用中需要注意

页面数据提交

本来,页面提交请求的代码不在本文的讨论范围,但是既然要写完整的,那就也写写吧

对于上传文件,需要使用post请求,并且<form>的属性里面需要设置 enctype="multipart/form-data"

一个完整的<form>标签形如

<form action='/system-upgrade' method="post" enctype="multipart/form-data">
    文件:<input type="file" name="file">
    <input type="submit" value='submit'>
</form>

实际中还可能包含其他的输入域,和控制器对应即可

控制器接收请求

控制器在对应的方法上标明接收post请求,使用MultipartFile表示上传的文件的相关信息

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

    @RequestMapping(value = "/system-upgrade", method = RequestMethod.POST)
    @ResponseBody
    public BooleanResultVO upgradeSystem(@RequestParam MultipartFile file) {
        webLogService.addAdminLog("upgrade system, upload file:" + file.getOriginalFilename());
        return new BooleanResultVO(systemService.upgrade(file));
    }

 

文件处理

实际中往往需要将文件存储起来,同时需要记录用户上传的文件的名字,
但是这个名字往往包含一些特殊符号,以及还有可能与存储目录已有的文件重复

下面演示记录用户上传的名字,同时使用时间戳作存储实际文件名的方案

public Boolean uploadFile(MultipartFile file) {
    // test.mp3
    String originalName = file.getOriginalFilename();
    // test
    String showName = originalName.substring(0, originalName.lastIndexOf("."));
    // .mp3
    String subfix = originalName.substring(showName.length());
    // mp3
    String format = subfix.substring(1).toLowerCase();
    if (!("mp3".equals(format) || "wav".equals(format))) {
        logger.info("try to upload voice file failed, filename subfix:" + format);
        return Boolean.FALSE;
    }
    logger.debug("try to upload voicefile:" + originalName);

    String fileName = String.valueOf(System.currentTimeMillis());
    File destFile = new File(VoiceFile.FILE_PATH, fileName + subfix);
    try {
        file.transferTo(destFile);
    } catch (IOException e) {
        logger.error(e.toString());
        return Boolean.FALSE;
    }
    VoiceFile voiceFile = new VoiceFile();
    voiceFile.setFileName(fileName);
    voiceFile.setFileFormat(format);
    voiceFile.setShowName(showName);
    voiceFile = voiceFileDao.save(voiceFile);
    logger.info("uploaded voicefile,name:" + destFile.getName());
    return Boolean.TRUE;
}

这种有一个关键的api

  • file.getOriginalFilename() 获取文件在用户哪里的文件名
  • file.transferTo(destFile) 将文件转存为指定的文件


还有一种是使用文件拷贝的

import org.apache.commons.io.FileUtils;

    String fileName = srcFile.getOriginalFilename();
    File destFile = new File(parent, fileName);
    try {
        FileUtils.copyInputStreamToFile(srcFile.getInputStream(), destFile);
    } catch (IOException e) {}

 

这种方式需要捕获异常,而且底层技术都是一样的,但是使用file.transferTo(destFile)是spring包装处理的,可以为将来的优化提供空间

© 著作权归作者所有

共有 人打赏支持
阿信sxq

阿信sxq

粉丝 227
博文 83
码字总数 73652
作品 1
成都
后端工程师
私信 提问
Controller中servletFileUpload.parseRequest(request)解析为空

原因分析 首先我们来看下Spring mvc 中文件上传的配置 方式二 这里springMVC 都为我们封装好成自己的文件对象了,转换的过程就在我们所配置的CommonsMultipartResolver这个转换器里面下面再来...

抢地主
2017/11/04
0
0
SpringMVC中servletFileUpload解析为空

原因分析 首先我们来看下Spring mvc 中文件上传的配置 再来看看Controller中使用 方式二 这里springMVC 都为我们封装好成自己的文件对象了,转换的过程就在我们所配置的CommonsMultipartResol...

rock912
2015/11/04
0
0
Spring MVC 实践 - Component

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hanqing280441589/article/details/51831979 标签 : Java与Web Converter Spring MVC的数据绑定并非没有任何...

菜鸟-翡青
2016/07/05
0
0
fastupload-springmvc 0.5.5 发布

fastupload-springmvc是利用fastupload开源组件Spring MVC框架写的文件上传插件,使用此插件,能在Controller中以注解的方式来获取上传的文件,然后对其进行操作。比使用fastupload核心API更...

仪山湖
2013/04/15
1K
8
文件的上传和下载--SpringMVC

文件的上传和下载是项目开发中最常用的功能,例如图片的上传和下载、邮件附件的上传和下载等。 接下来,将对Spring MVC环境中文件的上传和下载进行详细的讲解。 一.文件上传 多数文件上传都...

一飞要上天
2018/08/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Python如何开发桌面应用程序?Python基础教程,第十三讲,图形界面

当使用桌面应用程序的时候,有没有那么一瞬间,想学习一下桌面应用程序开发?行业内专业的桌面应用程序开发一般是C++,C#来做,Java开发的也有,但是比较少。本节课会介绍Python的GUI(图形用...

程序员补给栈
今天
3
0
kafka在的使用

一、基本概念 介绍 Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。 这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统...

狼王黄师傅
今天
1
0
Android JNI总结

0x01 JNI介绍 JNI是Java Native Interface的缩写,JNI不是Android专有的东西,它是从Java继承而来,但是在Android中,JNI的作用和重要性大大增强。 JNI在Android中起着连接Java和C/C++层的作...

天王盖地虎626
昨天
1
0
大数据教程(11.8)Hive1.2.2简介&初体验

上一篇文章分析了Hive1.2.2的安装,本节博主将分享Hive的体验&Hive服务端和客户端的使用方法。 一、Hive与hadoop直接的关系 Hive利用HDFS存储数据,利用MapReduce查询数据。 二、Hive与传统数...

em_aaron
昨天
3
0
跟我学Spring Cloud(Finchley版)-15-Hystrix监控详解

Hystrix提供了监控Hystrix Command的能力,本节来详细探讨。 监控端点与数据 应用整合Hystrix,同时应用包含spring-boot-starter-actuator 依赖,就会存在一个/actuator/hystrix.stream 端点...

周立_ITMuch
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部