文档章节

spring mvc的文件上传

阿信sxq
 阿信sxq
发布于 2017/05/22 15:13
字数 801
阅读 160
收藏 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

粉丝 226
博文 82
码字总数 72407
作品 1
成都
后端工程师
私信 提问
Spring MVC 实践 - Component

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

菜鸟-翡青
2016/07/05
0
0
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
文件的上传和下载--SpringMVC

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

一飞要上天
08/23
0
0
spring mvc文件上传实现进度条

文件上传应该大部分人都接触过,一般都是基于commons-fileupload组件来实现,SpringMVC的文件上传功能也是在commons-fileupload组件提供的功能上面做了一些包装功能,使文件上传开发更容易方...

小天120
2014/02/10
0
20

没有更多内容

加载失败,请刷新页面

加载更多

从源码入手,一文带你读懂Spring AOP面向切面编程

之前《零基础带你看Spring源码——IOC控制反转》详细讲了Spring容器的初始化和加载的原理,后面《你真的完全了解Java动态代理吗?看这篇就够了》介绍了下JDK的动态代理。 基于这两者的实现上...

公众号_Zack说码
10分钟前
1
0
maven 常用命令

mvn deploy -Dmaven.test.skip=true mvn source:jar deploy -Dmaven.test.skip=true mvn dependency:tree -Doutput=1.txt...

yzzzzzzzz
11分钟前
0
0
JavaScript之Promise对象

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了 Promise 对象。 Pr...

前端攻城老湿
12分钟前
1
0
mysql事务,select for update,及数据的一致性处理

在MySQL的InnoDB中,预设的Tansaction isolation level 为REPEATABLE READ(可重读) 在select 的读取锁主要分为两种方式 select .... lock in share mode select ..... for update   这两...

细节探索者
14分钟前
0
0
python 将txt文件转换成excel

emmm,作为一个小白,不会的东西真的太多了,这两天好头大啊!加油坚持吧! #file_affilication = open('Affiliations.txt','r')import xlwtimport os import sysdef txt_xls(...

BellaYu
19分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部