SpringMVC的上传与下载

文章目录

    • SpringMVC的上传
    • SpringMVC的下载

SpringMVC的上传

[1] 上传的功能需求

随着我们互联网的发展,我们的用户从直接访问网站获取信息。变为希望将自己本地的
资源发送给服务器,让服务器提供给其他人使用或者查看。还有部分的用户希望可以将
本地的资源上传服务器存储起来,然后再其他的电脑中可以通过访问网站来获取上传的
资源,这样用户就可以打破空间的局限性,再任何时候只要有网有电脑就可以对自己的
资源进行操作,比如:云存储,云编辑。

[2] 上传的原理图
在这里插入图片描述

[3] 上传的前台实现

  1. 如何在页面中显示一个按钮,用户可以点击该按钮后选择本地要上传的文件
    在页面中使用input标签,type值设置为”file”即可
  2. 确定上传请求的发送方式
    上传成功后的响应结果在当前页面显示,使用ajax请求来完成资源的发送
  3. 上传请求的请求数据及其数据格式
    请求数据:
    上传的文件本身
    普通数据:用户名,Id,密码等,建议上传功能中不携带除上传资源以外的数 据
    数据格式:
    传统的请求中,请求数据是以键值对的格式来发送给后台服务器的,但是在
    上传请求中,没有任何一个键可以描述上次的数据,因为数据本身是非常大的
    键就相当于一个变量,我们使用一个变量存储一个10g的电影显然是不可能 的。在上传请求中,将请求数据以二进制流的方式发送给服务器。
  4. 在ajax中如何发送二进制流数据给服务器
    ① 创建FormData的对象,将请求数据存储到该对象中发送
    ② 将processData属性的值设置为false,告诉浏览器发送对象请求数据
    ③ 将contentType属性的值设置为false,设置请求数据的类型为二进制类型。
    ④ 正常发送ajax即可
  5. 上传成功后,后台服务器应该响应什么结果给浏览器,并且浏览器如何处理
    后台服务器处理完成后,响应一个json对象给浏览器,示例格式如下:
    {
    state:true,
    msg:“服务器繁忙”,
    url:”上传成功的资源的请求地址”
    }
  6. 代码示例(注册功能,用户头像):
<%--声明js代码域--%>
<script type="text/javascript">/****************资源上传功能实现**********************************/$(function () {//给上传按钮增加单击事件$("#btnUpload").click(function () {//获取要上传的文件资源var file=$("#file")[0].files[0];//创建FormData对象存储要上传的资源var formData=new FormData();formData.append("photo",file);//发起ajax请求完成资源上传$.ajax({type:"post",//使用post类型的请求data:formData,//请求数据url:"regUpload",//请求地址processData:false,contentType:false,success:function (data) {//回调函数//将响应数据转换为json对象eval("var obj="+data);//判断if(obj.status==true){alert("上传成功")}else{alert(obj.msg);}}})})})
</script>

[4] 上传的后台实现
注意:

需要在项目导入上传相关的jar包
在这里插入图片描述

  1. 如何在单元方法中获取上传请求的请求数据

传统的请求中,上传的数据是键值对数据,我们可以直接使用request对象中
的getParameter(“键名”)来获取请求数据,或者在单元方法上声明形参来
接收DispatcherServlect传递的请求数据。而在上传请求中,请求数据是二
进制流数据,tomcat服务器在接收到请求后,仍然将请求数据封装到request对 象中,调用DispatcherServlet处理请求,并将存储了上传请求数据的request 对象作为实参传递给DispatcherServlet,而DispatcherServlet会根据请求调用对 应的单元方法来处理请求,而这个时候因为request中存储的是二进制请求数据
我们就无法再使用req.getParameter来获取请求数据了。我们希望 DispatcherServlet将request对象中的二进制数据进行解析,然后将解析后的结 果传递给单元方法处理。也就是说DispatcherServlet会调用一个工具类来完成
二进制数据的解析,所以需要我们在springmvc.xml文件中配置上传解析的bean
对象给DispatcherServlet使用。其实说白了就是需要在springmvc.xml文件中
配置SpringMVC官方提供的上传解析bean即可,我们正常的在单元方法上,声
明形参直接接收解析后的结果完成请求处理即可。

  1. 将上传的资源存储到服务器的硬盘中

① 确定资源要写入到硬盘中的存储路径
② 确定文件存储的文件名,每次存储的文件名都是唯一的。
③ 使用IO流将文件输出到服务器硬盘中存储起来

  1. 将上传的结果响应给浏览器

① 设置单元方法的返回值类型为void
② 使用response对象完成直接响应
③ 响应一个json字符串给浏览器
{
state:true,
msg:“服务器繁忙”,
url:”上传成功的资源的请求地址”
}

  1. 代码示例
    上传解析bean的配置

<!--配置上传解析bean:给DispatcherServlet使用,调用该bean对象完成request对象中的上传数据的解析--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>

单元方法代码示例:

//声明单元方法:处理文件上传请求
/**** 形参MultipartFile*    该形参是用来接收DispatcherServlet解析request对象后存储了文件二进制数据的对象。*    形参的名字必须是上传请求中的文件的键名* @param photo* @param response*/
@RequestMapping("regUpload")
public void regUpload(MultipartFile photo, HttpServletResponse response, HttpServletRequest request) throws IOException {//1.确定文件存储路径//使用ServletContext对象动态获取项目根目录下的upload文件夹的路径,作为资源存储路径String path=request.getServletContext().getRealPath("/upload");System.out.println(path);//2.确定文件存储的名字//获取文件的原始名 ab.c.jpgString oldName=photo.getOriginalFilename();//获取文件存储的后缀名String suffix=oldName.substring(oldName.lastIndexOf("."));//.jpg//创建文件新的名字 名+后缀 比如 a.jpgString newName= UUID.randomUUID()+""+suffix;//3.完成存储//创建file对象存储资源路径File f=new File(path);if(!f.exists()){f.mkdirs();//创建存储路径}//输出存储photo.transferTo(new File(f,newName));//4.响应结果//创建UploadResult对象存储响应数据UploadResult uploadResult=new UploadResult(true,"",newName);//将uploadResult对象转换为json对象String jsonStr=new Gson().toJson(uploadResult);//直接响应response.getWriter().write(jsonStr);
}

SpringMVC的下载

[1] 下载的基本流程

文件的上传是将用户本地的资源发送到服务器,让服务器存储到其硬盘中的过程。
而下载和上传正好是相反的过程。下载是用户发起请求,请求要下载的资源。服务器
根据请求,将其硬盘中的文件资源发送给浏览器的过程。

[2] 下载的请求数据

用户通过浏览器发起下载请求,服务器在接收到请求后,根据当前请求的用户信息,去 数据库中获取当前用户要下载的资源的文件路径,然后服务器再去其硬盘中读取对应的 文件,将文件响应给浏览器,基于此过程,下载请求的请求数据为:
简单的下载:文件的路径直接作为一个字段存储在用户信息表中
用户的ID。
复杂的下载:数据库中专门有一张表记录要下载的文件资源
用户的ID
要下载的资源ID

[3] 下载的后台实现

  1. 创建单元方法处理下载请求
  2. 根据请求获取要下载的资源的流对象
  3. 读取文件并将资源响应给浏览器

[4] 下载的示例代码

//声明单元方法:处理下载请求
@RequestMapping("downFile")
public void downFile(String filename, HttpServletResponse response, HttpServletRequest request) throws IOException {//设置下载资源的MIME类型?//设置响应头,告诉浏览器下载的资源需要存储到客户端的硬盘中,而不是解析打开。response.setHeader("Content-Disposition", "attachment;filename="+filename);//1.获取要下载的资源的流对象//获取文件的绝对路径String path=request.getServletContext().getRealPath("/upload");//获取文件的二进制数据byte[] bytes = FileUtils.readFileToByteArray(new File(path, filename));//2.响应浏览器//获取输出流对象ServletOutputStream outputStream = response.getOutputStream();//响应资源outputStream.write(bytes);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中秋节支付宝口令红包解析

大家好&#xff0c;我是雄雄。继上篇文章&#xff08;10.1日&#xff09;发完之后就没有再日更公众号了&#xff0c;给自己也放几天假。这个假期实在是太太太长了&#xff0c;放的我都心气憔悴&#xff01;出去玩吧&#xff0c;没地儿去&#xff0c;在家吧&#xff0c;除了看书…

asp.net core高级应用:TagHelper+Form

上一篇博客《asp.net core新特性(1):TagHelper》我讲解了TagHelper的基本用法和自定义标签的生成&#xff0c;那么我就趁热打铁&#xff0c;和大家分享一下TagHelper的高级用法~~&#xff0c;大家也可以在我的博客下随意留言。对于初步接触asp.net core的骚年可以看看我对TagHe…

爸妈没多大本事……

本文原创&#xff1a;王晓丹世界上什么都不公平&#xff0c;唯独时间最公平&#xff0c;你是懒惰还是勤奋&#xff0c;时间都会给出结果。每个人都是孤独的&#xff0c;你的人生不会辜负你的。那些流下的泪和那些辛苦的汗水 全都让你成为一个独一无二的自己。把懒惰放一边 &…

我终于搞清楚了和String有关的那点事儿

转载自 我终于搞清楚了和String有关的那点事儿 String&#xff0c;是Java中除了基本数据类型以外&#xff0c;最为重要的一个类型了。很多人会认为他比较简单。但是和String有关的面试题有很多&#xff0c;下面我随便找两道面试题&#xff0c;看看你能不能都答对&#xff1a…

SpringMVC的拦截器

文章目录SpringMVC的拦截器学习SpringMVC的拦截器学习 [1] SpringMVC拦截器的介绍 问题: 在之前学习Servlet的时候&#xff0c;我们学习了过滤器的知识。过滤器的作用是保护 请求的服务器资源&#xff0c;在请求资源被执行之前&#xff0c;如果请求地址符合拦截范围&#xff…

考研英语二大纲22年考研

全国硕士研究生招生考试英语(二)考试大纲(非英语专业)(2022年版)   I.考试性质   英语(一)考试是为高等学校和科研院所招收硕士研究生而设置的具有选拔性质的全国统一入学考试科目&#xff0c;其目的是科学、公平、有效地测试考生对英语语言的运用能力&#xff0c;评价的标…

ssl1763-观光旅游【最小环,Floyd,dijkstra】

正题 就是给出一个无向图&#xff0c;求最小环。 输入输出&#xff08;需要自取&#xff09; Input 每组数据的第一行包含两个正整数&#xff1a;十字路口的个数N(N<100)&#xff0c;另一个是道路的 数目M(M<10000)。接下来的每一行描述一条路&#xff1a;每一行有三个…

物联网模式下的多活数据中心架构认识与实践

做互联网应用很重要的一点是要保证服务可用性&#xff0c;特别是某些业务更是需要7*24小时不间断的对外提供服务&#xff0c;任何停机、宕机都会引起大面积的用户不满。持续可用性是把业务服务化时一个需要考虑的重要指标&#xff0c;很多时候我们都会牺牲一些功能来换取可用性…

subList?? subString???

今天看到了java中List中有个subList方法&#xff0c;感觉很熟悉有没有&#xff1f;没错&#xff0c;在Stirng类中&#xff0c;也有个类似的方法&#xff1a;subString。1String类的subStringString中的subString方法&#xff0c;官方解释是&#xff1a;返回字符串的子字符串&am…

互联网级监控系统必备-时序数据库之Influxdb集群及踩过的坑

上篇博文中&#xff0c;我们介绍了做互联网级监控系统的必备-Influxdb的关键特性、数据读写、应用场景&#xff1a;互联网级监控系统必备-时序数据库之Influxdb 本文中&#xff0c;我们介绍Influxdb数据库集群的搭建&#xff0c;同时分享一下我们使用集群遇到的坑&#xff01;…

考研数学二大纲22年考研

考试科目&#xff1a;高等数学、线性代数   考试形式和试卷结构   一、试卷满分及考试时间   试卷满分为150分&#xff0c;考试时间为180分钟.   二、答题方式   答题方式为闭卷、笔试.   三、试卷内容结构   高等教学 约80%   线性代数 约20%   四、试卷题…

ssl1500-最短路上的统计【Floyd】

正题 个无向图上&#xff0c;没有自环&#xff0c;所有边的权值均为1&#xff0c;对于一个点对&#xff08;a,b&#xff09;,我们要把所有a与b之间所有最短路上的点的总个数输出。 输入输出&#xff08;需要自取&#xff09; Input 第一行n,m,表示n个点&#xff0c;m条边 接…

Java中的subList方法

Java中的subList方法 今天看到了java中List中有个subList的方法&#xff0c;感觉很熟悉有没有&#xff1f;没错&#xff0c;在Stirng类中&#xff0c;也有个类似的方法&#xff1a;subString。 Stirng中的subString方法&#xff0c;官方解释是&#xff1a;返回字符串的子字符串…

考研408大纲22年考研

I 考试性质   计算机学科专业基础综合考试是为高等院校和科研院所招收计算机科学与 技术学科的硕士研究生而设置的具有选拔性质的联考科目&#xff0c;其目的是科学、公平、 有效地测试考生掌握计算机科学与技术学科大学本科阶段专业知识、基本理论、 基本方法的水平和分析问…

在Apworks数据服务中使用基于Entity Framework Core的仓储(Repository)实现

《在ASP.NET Core中使用Apworks快速开发数据服务》一文中&#xff0c;我介绍了如何使用Apworks框架的数据服务来快速构建用于查询和管理数据模型的RESTful API&#xff0c;通过该文的介绍&#xff0c;你会看到&#xff0c;使用Apworks框架开发数据服务是何等简单快捷&#xff0…

再有人问你Java内存模型是什么,就把这篇文章发给他

转载自 再有人问你Java内存模型是什么&#xff0c;就把这篇文章发给他 前几天&#xff0c;发了一篇文章&#xff0c;介绍了一下JVM内存结构、Java内存模型以及Java对象模型之间的区别。有很多小伙伴反馈希望可以深入的讲解下每个知识点。Java内存模型&#xff0c;是这三个知识…

SpringMVC对Ajax请求的处理

SpringMVC对Ajax请求的处理 [1] 问题: 当浏览器发起一个ajax请求给服务器&#xff0c;服务器调用对应的单元方法处理ajax请求。 而ajax的请求在被处理完成后&#xff0c;其处理结果需要直接响应。而目前我们在单元方 法中响应ajax请求&#xff0c;使用的是response对象&#x…

ssl2344P2835-刻录光盘【Floyd,联通块数,图论】

正题 洛谷题目 就是给出一个图&#xff0c;求最小联通块数。 输入输出&#xff08;需要自取&#xff09; Input 先是一个数N&#xff0c;接下来N行&#xff0c;分别表示各个营员愿意把自己获得的资料拷贝给其他哪些营员。即输入数据的第N1行表示第i个营员愿意把资料拷贝给那…

为了金秋那沉甸甸的麦穗,我绝不辜负春天

本文原创&#xff1a;焦文宇我可以一落千丈&#xff0c;但我就是要一鸣惊人。——题记01 没有谁的一生是一帆风顺的&#xff0c;也没有谁的一生是充满坎坷的。人生就像是一场游戏“玩”的好坏全都在于自己&#xff0c;我们没有任何理由去抱怨生活中的点滴&#xff0c;我们应当对…

BigDecimal丢失精度的坑

问题&#xff1a;new BigDecimal(double d)的数值居然还是不精确的 double d 0.09; BigDecimal bigDecimalnew BigDecimal(d); System.out.println(bigDecimal); System.out.println(d); 输出结果&#xff1a; 0.0899999999999999966693309261245303787291049957275390625 …