当前位置: 首页 > 编程日记 > 正文

Spring MVC环境中的文件上传功能实现

在实际开发过程中,尤其是web项目开发,文件上传和下载的需求的功能非常场景,比如说用户头像、商品图片、邮件附件等等。其实文件上传下载的本质都是通过流的形式进行读写操作,而在开发中不同的框架都会对文件上传和下载有或多或少的封装,这里就以Spring MVC环境中文件的上传为例,讲解Spirng MVC环境下的文件上传功能实现。

一、客户端编程

      由于多数文件上传都是通过表单形式提交给后台服务器的,因此,要实现文件上传功能,就需要提供一个文件上传的表单。同时该表单必须满足以下3个条件:

  • form表单的method属性设置为post;
  • form表单的enctype属性设置为multipart/form-data;
  • 提供<input type="file" name="fileName" />的文件上传输入框。

在HTML5之前,如果想要上传多个文件,必须使用多个<input>元素。但是在HTML5中,在<input>元素配置multiple属性即可进行多个文件的上传。在HTML5中编写以下任意一行代码,便可生成一个按钮供选择多个文件:

  • <input type="file" name="fileName" multiple />
  • <input type="file" name="images" multiple="multiple" />
  • <input type="file" name="images" multiple="" />

具体代码示例如下:

<form action="uploadUrl" method="post" enctype="multipart/form-data"><input type="file" name="images" multiple="multiple" /><input type="submit" value="文件上传" />
</form>

二、springmvc-config.xml配置文件配置

当客户端form表单的enctype属性为multipart/form-data时,浏览器就会采用二进制流的方式来处理表单数据,而对于文件上传的处理则涉及在服务器端解析原始的HTTP请求。Spring MVC为文件上传提供了直接的支持,这种支持是用即插即用的MultipartResolver实现的。

在Sring MVC中使用MultipartResolver也非常简单,只需要在Spring MVC配置文件springmvc-config.xml中定义MultipartResolver接口实现类即可,示例如下:

<!-- 配置文件上传类型解析器 multipartResolver-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 设置上传文件最大尺寸,单位为B --><property name="maxUploadSize" value="5242880" />
</bean>

  注意:

由于MultipartResolver实现类CommonsMultipartResolver内部是引用multipartResolver字符串获取该实现类对象并完成文件上传操作的,所以在配置CommonsMultipartResolver时必须指定该bean的id为multipartResolver。另外由于MultipartResolver实现类CommonsMultipartResolver是Spring MVC内部通过Apache Commons FileUpload技术实现的。因此Spirng MVC的文件上传还需要依赖Apache Commons FileUpload的组件,即需要导入支持文件上传和下载的JAR包,具体如下:

  • commons-fileupload.jar
  • commons-io.jar

三、后台文件下载实现(MultipartFile接口介绍)

当完成上述客户端代码的编写及文件上传组件的配置后,在Spring MVC中处理已经上传的文件就十分容易了,上传到Spring MVC程序中的文件会被封装到一个MultipartFile对象中,然后开发者通过该对象的方法就可以进行后续相关处理了。

编写后台文件上传控制器类及方法,具体示例如下:

/*** 向文件上传页面跳转*/
@RequestMapping("/toFileUpload")
public String toFileUpload( ){return "fileUpload";
}
/*** 接收文件上传请求*/
@RequestMapping("/fileUpload")
public String fileUpload(List<MultipartFile> images){//对上传图像进行解析操作if(images !=null && images.size()>0){for (MultipartFile image : images) {//获取上传文件的原始名称String originalFilename = image.getOriginalFilename();//设置上传文件的保存地址目录String dirPath="D:\\fileUpload\\";File file =new File(dirPath);//如果保存文件的地址不存在,就先创建目录if(!file.exists()){file.mkdirs();}//使用UUID重新命名上传的文件名称(看公司需求,也可以用日期时间)String newFilename= UUID.randomUUID()+originalFilename.substring(originalFilename.lastIndexOf("."));try {//使用MultipartFile接口的方法完成文件上传到指定位置image.transferTo(new File(dirPath+newFilename));//文件上传成功后,需要将文件存放路径存入数据库中//TODO,省略} catch (Exception e) {e.printStackTrace();//当文件上传出现异常,则重定向到文件上传页面return "redirect:toFileUpload";} }}//文件上传成功后,跳转到成功页面return "success";
}

四、效果演示(读者可以自己编写项目和jsp页面)

    部署并启动web服务器,在浏览器地址啦输入地址:http://localhost:8080/webname/toFileUpload后(读者根据自己的项目和路径进行访问),浏览器的显示效果如下图所示

上面我选择了上传2个文件,然后点击提交后,即可完成上传。读者操作后可自行到指定上传位置进行验证。

至此,Sring MVC环境下文件上传功能代码即已实现。

转载于:https://www.cnblogs.com/com-itheima-crazyStone/p/6739862.html

相关文章:

iOS架构篇-5 CI/CD(持续集成、持续交付、持续部署)

iOS架构篇-5 CI/CD(持续集成、持续交付、持续部署) CI CI是指持续集成,代码的更新会定期自动构建、测试并合并到公共仓库中,方便多分支时解决冲突问题 CD CD是指持续交付和/或持续部署,开发人员改动代码会自动测试提交到仓库,运维实施人员将其部署到生产环境中,方便部…

计算机函数模式的用处是啥,请问怎么理解计算机中的函数?

你的理解有点外行看热闹的意思&#xff0c;呵呵。代码本身就是抽象的&#xff0c;所以“计算机中的函数是一种对代码进行抽象的方式”不能说不对&#xff0c;但是也和没说一样。至于“我们使用抽象出来的函数&#xff0c;而不用关心函数里面的代码是如何组织的”&#xff0c;只…

CV00-03-CV基本操作2

基本操作2 Similarity Transform相似变换 Similarity Transform相似变换&#xff1a;图像形状大小不变&#xff0c;位置发生变化。比如&#xff1a;做平移、旋转。相似变换具有保角性、保比例性&#xff0c;经过相似变换以后原有的角度和比例保持不变。确定一个相似变换矩阵需…

[LeetCode] [C++] 第一轮刷题总结(持续更新~~~)

LeetCode 解题报告 LC_1_解题报告LC_2_解题报告LC_3_解题报告LC_4_解题报告LC_5_解题报告LC_6_解题报告LC_7_解题报告LC_206_解题报告LC_237_解题报告LC_344_解题报告 LeetCode 1. Two Sum 解题思路&#xff1a;两次循环遍历数组&#xff0c;找到两个元素和等于target 注意点&…

Android Studio 在项目中引用第三方jar包

在Android Studio项目中引用第三方jar包的方法&#xff1a; 步骤&#xff1a; 1、在build.gradle文件中添加如下代码&#xff1a; 备注&#xff1a;要添加在Android作用域下 sourceSets {main {jniLibs.srcDirs [libs]}} 点击【Sync Now】&#xff0c;会生成jniLibs文件夹 找到…

android专栏目录

android专栏目录 Android基础篇 android专题-数据库room android专题-蓝牙扫描、连接、读写 Android专题-常用第三方框架 Android高级篇 Android架构篇-1 项目组织架构 Android架构篇-2 国际化多语言 Android架构篇-3 网络接口封装 Android架构篇-4 架构模式MVVM Android架…

东北大学计算机分数线2017,东北大学2017年本科一批录取分数线(全国)

东北大学2017年全国各省各批次集中录取时间为7月6日-27日&#xff0c;在各省录取结束的分批次分科类录取最低分将在本页面持续更新公布&#xff0c;考生录取结果可通过关注东北大学招生办官方微信公众号(neuzs-1923)录取专区查询&#xff0c;最终录取结果请以考生收到的录取通知…

CV00-04-卷积

卷积概念 由于不好进行文字描述&#xff08;懒&#xff09;&#xff0c;我直接推荐一个博客图像卷积&#xff0c;讲解图像卷积的概念。 图像卷积操作&#xff08;convolution&#xff09;&#xff0c;或称为核操作&#xff08;kernel&#xff09;&#xff0c;是进行图像处理的…

unity项目build成webgl时选择生成目录(解决方法)

在unity里点击File>>Build Settings...>>勾选你要生成的Scenes>>选择webgl>>后面Development Build不要勾选&#xff1a;点击build后会让你选择生成的目录&#xff0c;此处要慎重选择&#xff0c;否则会报错&#xff01; 不要选择到项目所在目录&#…

STL中的nth_element()方法的使用

STL中的nth_element()方法的使用 通过调用nth_element(start, startn, end) 方法可以使第n大元素处于第n位置&#xff08;从0开始,其位置是下标为 n的元素&#xff09;&#xff0c;并且比这个元素小的元素都排在这个元素之前&#xff0c;比这个元素大的元素都排在这个元素之后&…

Android架构篇-2 国际化多语言

Android架构篇-2 国际化多语言 实现功能: 1.默认采用系统语言 2.语言切换后实时生效 3.支持中英文 4.我的->设置->切换语言 思路:app首次初始设置为系统语言,用户在app内切换语言时发送语言切换事件,刷新所有页面 在AppBaseActivity、AppBaseFragment通过EventB…

齐鲁工业大学计算机读研,齐鲁工业大学考研难吗

齐鲁工业大学考研难吗&#xff1f;1、齐鲁工业大学考研难度算是比较容易。不在大学考研难度排名前100名单之内。2、考研究生难易程度还是看招生院校的地域、名气、排名等因素&#xff0c;生源不同&#xff0c;竞争力度也不同。发达地区特别是像北京&#xff0c;上海这样的大城市…

Python基础18-常用模块之os、sys、json、pickle、shelve、xml、re、logging、configparse、hashlib等

目录 os、os.path sys json pickle、shelve、xml、re、logging、configparse、hashlib未完待续…… os、os.path Python的os模块里面定义了常用的路径、文件操作。 os.curdir # curdir相对路径的当前路径“点” os.pardir # pardir相对路径的父目录“点点”。 os.sep …

剑指offer 重建二叉树 python

题目描述 输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 样例 输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6} 返回二叉树头节点想法&#xff1a; 使用递归&#xff0c;既…

C#中的Liststring泛型类示例

在C#代码中使用一系列字符串(strings)并需要为其创建一个列表时&#xff0c;List<string>泛型类是一个用于存储一系列字 符串(strings)的极其优秀的解决办法。下面一起有一些List<string>泛型类的示例&#xff0c;一起来看看吧。 List示例 下面是一个使用C#创建一个…

计算机检索的优点,专利检索与分析系统拥有哪些优势?

专利检索与分析系统拥有哪些优势&#xff1f;现在很多朋友都在了解专利检索与分析系统又有哪些优势&#xff0c;因为他们需要使用这些系统&#xff0c;不少朋友都会利用业余时间搞各种发明专利&#xff0c;并申请发明专利&#xff0c;在申请之前&#xff0c;人们就需要对专利进…

Android架构篇-1 项目组织架构

Android架构篇-1 项目组织架构 模块化分层 1.结构清晰,各模块代码分离,符合高内聚低耦合,快速定位查找代码 2.团队协作开发灵活,互不影响,各模块完成后合并即可完成整体app 3.抽离公共层、模块层、业务层,方便维护管理 分层架构图 App下的Home(首页)、Mine(我的)、Log…

Python基础19-面向对象基础

目录 面向对象概述 面向对象的一种实现 类的相关知识 对象的相关知识 面向对象属性的查改增删操作 类属性的查改增删 对象属性的查改增删 关于类、对象属性容易混淆额或忽略的地方的说明 面向对象概述 编程发展至今有面向过程编程、函数式编程、面向对象编程三大流派&…

《一杯沧桑》有感

《一杯沧桑》 “每一个人的一生&#xff0c; 都是一仅仅杯子。 仅仅是杯子的大小不一样。 有些杯子&#xff0c; 它能够装下一片汪洋&#xff0c; 而有些杯子&#xff0c; 它却装不下一点忧伤。 …

Android架构篇-3 网络接口封装

Android架构篇-3 网络接口封装 实现功能: 1.暴露参数请求地址url、请求方法method、请求参数params、请求头header、请求响应response、https请求证书 2.支持get、post、文件上传下载、https证书 以封装OKhttp为例: 接口定义 业务层接口定义 public class BusinessSer…

域中计算机设定重启,域中添加计算机设定的步骤

我来和你详细说下吧&#xff01;既然你已经建立域了&#xff0c;那么就好办了&#xff01;1。为各台电脑建立域帐号&#xff01;2.在每台电脑上加域&#xff01;a、首先在每台电脑上将用户的权限降到USER。b、右键选我的电脑&#xff0c;在计算机名称里面把域一栏里面输入你自己…

浅谈 拓扑排序

我是什么时候想到要学拓扑排序的呢&#xff1f; 在一次模考的时候&#xff0c;有这样一道题&#xff0c;叫做食物链&#xff0c;我是写了记忆化搜索的&#xff0c;然而全场都写了拓扑板子 后来发现我居然不会这么基础的算法&#xff0c;有点慌 下面进入正题 拓扑排序是针对一些…

Python基础20-面向对象:静态、组合、继承与派生、多态、封装、反射、内置attr方法等

目录 静态 静态属性property 类方法classmethod 静态方法staticmethod 组合 继承与派生 继承与派生 继承顺序 在子类中调用父类方法与super 多态 封装 反射 模块的动态导入 内置的attr方法 带双下户线的attr方法__setattr__、__getattr__、__delattr__ __getat…

C++ primer 第三章笔记

chapter 3 字符串,向量,数组 # 命名空间的using声明 头文件不应包含using声明; 注:using namespace std; #标准库类型string 1.string 表示可变长的字符序列; 2.#include<string> 3.字符串字面量 与 string 是不同类型; 4.cctype头文件种定义了一组标准库函数(改变某个字…

街篮最新服务器,《街篮》全新两组服务器开启 与你一起迎新年!

2016还剩下几个小时&#xff0c;2017即将到来。为了庆祝新的一年到来&#xff0c;《街篮》两组全新的服务器“闻鸡起舞”与“金鸡独立”正式与大家见面&#xff01;本次新服务器将在官服和混服同时开启&#xff0c;其中“闻鸡起舞”属于G系的新服务器&#xff0c;而“金鸡独立”…

Android架构篇-4 架构模式MVVM

Android架构篇-4 架构模式MVVM MVVM原理 #mermaid-svg-CJmTYPxP5GkKNMic .label{font-family:trebuchet ms, verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-CJmTYPxP5GkKNMic .label text{fill:#333}#mermaid-svg-CJmTYPxP5GkKNM…

jupyter安装与初探

安装jupyter jupyterlab和jupyter notebook的关系暂时没有搞清楚。先都安装了吧&#xff0c;用用再说。 选择国内镜像&#xff0c;避免万里长城的干扰。 pip install jupyterlab -i http://uni.mirrors.163.com --trust-host uni.mirrors.163.com pip install jupyter noteb…

android专题-数据库Room

android专题-数据库Room Room介绍 room是Google官方推荐的ORM数据库框架&#xff0c;抽象出sqlite访问的数据库。 包含三大组件&#xff1a; Entity 定义 表结构&#xff0c;每个entity类对一个表&#xff0c;默认会把entity类所有字段都创建为表字段Dao 定义entity类的CRUD…

CentOS 6.7快速搭建lamp环境

安装前要关闭防火墙&#xff0c;防止外网不能访问&#xff0c;这一点很重要&#xff0c;要不然外网访问不了&#xff1b; ①关闭防火墙&#xff1a;service iptables stop ②永久关闭防火墙&#xff1a;chkconfig iptables off ③查看防火墙状态&#xff1a;service iptables …

1005 生日礼物

1005 生日礼物 时间限制: 1 s空间限制: 128000 KB题目等级 : 黄金 Gold题解题目描述 Description9月12日是小松的朋友小寒的生日。小松知道小寒特别喜欢蝴蝶&#xff0c;所以决定折蝴蝶作为给小寒的生日礼物。他来到了PK大学最大的一家地下超市&#xff0c;在超市里&#xff0c…