当前位置: 首页 > news >正文

day18文件上传下载与三层架构思想

servlet文件上传

注意事项:在写了响应后,若后面还需要执行代码,需要添加return;

apach的servlet3.0提供了文件上传的功能.

**在客户端中的jsp如何上传文件:**使用form标签

使用input标签type的file属性

form表单中的的enctype必须加:使用二进制的方式进行传输,否则不能进行传输

<form action="/registe" method="post" enctype="multipart/form-data">账号:<input type="text" name="username"><br>头像1:<input type="file" name="headImg"><br><input type="submit" name="注册">

在服务器获取客户端上传的文件:

方法作用
req.getPart(String name)获取请求中指定名字的单个文件
req.getParts()获取请求中所有的文件

返回的getPart(Sting name)中有以下的方法可以使用

方法作用
getContentType()获取文件的类型: img/png
getSize()获取文件大小: 70340
getSubmittedFileName()获取文件的名字: 小狗.png
getName()获取请求的属性: headImg
write(String filename)将接收到的文件保存在磁盘中

获取文件的细节

1.解决文件上传同名的问题

由于用户不关心上传后的文件名称,所以文件的名称可以不和源文件相同,所以我们只需要改变文件的名字就可以解决文件同名的问题,后缀名不用修改,只需要进行获取

//使用UUID生成唯一的文件名

String filename = UUID.randomUUID().toString();

//获取源文件的名字,首先得取到文件

headImg = req.getPart("headImg");
//获取这个文件的名字
String submittedFileName = headImg.getSubmittedFileName()

//得到"."在文件中最后出现的一次索引lastIndexOf

int index = submittedFileName.lastIndexOf(".");

//从文件名中根据索引截取扩展名subString

String ext = submittedFileName.substring(index);

//动态获取项目中的路径(使用SservletContext中的RealPath获取项目的绝对路径)

String realPath = req.getServletContext().getRealPath("/files");

//将上传的文件存在项目下的文件中,避免使用绝对路径

headImg.write(realPath+"\\"+filename+ext);

获取文件的时候需要自己手动部署项目

选择字节码输出目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lXxaeNPW-1684929761373)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230417212802286.png)]

添加输出目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sgq117zG-1684929761374)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230417212824654.png)]

修改tomcat的部署,使用自己的项目进行部署

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5erWDjGb-1684929761375)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230417212951526.png)]

用户上传的文件类型不符合解决办法

使用文件类型进行判断getPar的方法:headImg.getContentType().startsWith(“image/”)

servlet应该将错误信息响应给用户

if(!headImg.getContentType().startsWith("image/")){//告知用户,文件类型不正确//共享错误信息req.setAttribute("errMsg","文件类型不正确");回到注册页面req.getRequestDispatcher("/register.jsp").forward(req,resp);return;//结束当前方法的执行
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GOnLZ8cM-1684929761375)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230417213601867.png)]

限制用户上传文件的大小(servlet中进行限制)

以前使用书写java代码,现在使用注解的方式()@MultipartConfig进行限制文件上传的大小,

方法作用
maxFileSize=1024*…限制单个文件的大小
maxRequestSize=1024*…限制请求数据的大小

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cyKxY0bP-1684929761376)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230417214044690.png)]

用户文件的下载

这里的文件下载分别下载普通目录下的和WEB-INF下的文件,由于WEB-INF下的文件普通用户不能进行访问,所以只有通过使用servlet进行提取文件

1.普通用户文件的下载

在jsp中直接点击链接就可以进行下载,不需要通过java代码的处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0VM1VItt-1684929761376)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230417214550839.png)]

2.会员进行登录下载

jsp页面需要进行跳转的时候应该带上文件的名称拼接在路径上,使用servlet进行处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6lB8fPWc-1684929761377)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230417214847380.png)]

servlet的处理如下:

//获取请求中下载文件的名字

 String filename =req.getparameter("filename")

//找到WEB-INF/file在磁盘上的路径,使用 req.getServletContext().getRealPath()

String realPath = req.getServletContext().getRealPath("/WEB-INF/files");

//用户下载包的时候不能识别中文包的名字,需要将文件名设成浏览器识别的字符集

String s = new String(filename.getBytes(StandardCharsets.UTF_8), "ISO-8859-1");

//在响应头里面告诉浏览器下载文件的名字是什么,使用setHeader进行设置

resp.setHeader("Content-Disposition", "attachment;filename="+s);

//找到磁盘上的文件并响应给浏览器,使用Files的copy方法获取文件输出流,响应给浏览器

Files.copy(Path source, OutputStream out)//该方法的语法//将source路径指定的文件内容复制到out指定的输出流中。
Files.copy(Path.get(realpath,filename),resp.getOutputStream)

java
Files.copy(Path source, OutputStream out)//该方法的语法
//将source路径指定的文件内容复制到out指定的输出流中。


```java
Files.copy(Path.get(realpath,filename),resp.getOutputStream)

相关文章:

day18文件上传下载与三层架构思想

servlet文件上传 注意事项:在写了响应后,若后面还需要执行代码,需要添加return; apach的servlet3.0提供了文件上传的功能. **在客户端中的jsp如何上传文件:**使用form标签 使用input标签type的file属性 form表单中的的enctype必须加:使用二进制的方式进行传输,否则不能进行…...

Async/await详解

一、概念与背景 他是在ES8被提出的一种异步方式&#xff0c;它其实是promise的一种语法糖 二、 Async关键字 async 关键字用于快速声明异步函数 &#xff0c;可以用在函数声明、函数表达式、箭头函数和方法上 async function foo() {} let bar async function() {}; let…...

Mysql基础 — DDL、DML、DQL、DCL、函数、约束

文章目录 Mysql基础一、数据模型1.1 关系型数据库与非关系型数据库1.2 Mysql 数据模型 二、SQL2.1 SQL 通用语法2.2 SQL分类2.3 DDL2.3.1 数据库操作2.3.2 表操作 — 创建 & 查询2.3.3 表操作— 修改&删除2.3.4 数据类型2.3.4.1 数值类型2.3.4.2 字符串类型2.3.4.3 日期…...

中国移动董宁:深耕区块链的第八年,我仍期待挑战丨对话MVP

区块链技术对于多数人来说还是“新鲜”的代名词时&#xff0c;董宁已经成为这项技术的老朋友。 董宁2015年进入区块链领域&#xff0c;现任中国移动研究院技术总监、区块链首席专家。作为“老友”&#xff0c;董宁见证了区块链技术多个爆发式增长和平稳发展的阶段&#xff0c;…...

AI孙燕姿项目实现

最近在b站刷到很多关于ai孙笑川唱的歌曲&#xff0c;加上最近大火的ai孙燕姿&#xff0c; 这下“冷门歌手”整成热门歌手了 于是写下一篇文章&#xff0c; 如何实现属于的ai歌手。 注意滥用ai&#xff0c;侵犯他人的名誉是要承担法律责任的 下面是一些所需的文件链接&#xff…...

传统机器学习(六)集成算法(2)—Adaboost算法原理

传统机器学习(六)集成算法(2)—Adaboost算法原理 1 算法概述 Adaboost(Adaptive Boosting)是一种自适应增强算法&#xff0c;它集成多个弱决策器进行决策。 Adaboost解决二分类问题&#xff0c;且二分类的标签为{-1,1}。注&#xff1a;一定是{-1,1}&#xff0c;不能是{0,1} …...

性能优化常用的技巧,你都知道吗?

在实际工作中&#xff0c;提升MySQL数据库的查询性能是非常重要的。除了基本的索引和查询优化技巧外&#xff0c;还有一些更深层次的优化方案可以进一步优化性能。 1. 数据库表设计优化 选择字段类型&#xff1a; 根据数据类型和范围&#xff0c;选择适当的字段类型。例如&am…...

机器学习——损失函数(lossfunction)

问&#xff1a;非监督式机器学习算法使用样本集中的标签构建损失函数。 答&#xff1a;错误。非监督式机器学习算法不使用样本集中的标签构建损失函数。这是因为非监督式学习算法的目的是在没有标签的情况下发现数据集中的特定结构和模式&#xff0c;因此它们依赖于不同于监督式…...

小航助学2022年NOC初赛图形化(小高组)(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 单选题3.0分 删除编辑 答案:C 第1题如果要控制所有角色一起朝舞台区右侧移动&#xff0c;下面哪个积木块是不需要的&#xff1f; A…...

软考中级数据库系统工程师-第6-7章 数据库技术基础关系数据库

目录 1.数据库系统基本概念 2.数据库系统的三级模式结构 3.两级映像 4.数据的独立性 5.E-R模型 6.关系的相关名词 7.关系代数运算 8.关系数据库设计基础知识 9.规范化 1.数据库系统基本概念 1&#xff09;数据库系统(DBS)是一个采用了数据库技术&#xff0c;有组织地、…...

掌握RDD算子2

文章目录 扁平映射算子案例任务1、统计不规则二维列表元素个数方法一、利用Scala来实现方法二、利用Spark RDD来实现 按键归约算子案例任务1、在Spark Shell里计算学生总分任务2、在IDEA里计算学生总分第一种方式&#xff1a;读取二元组成绩列表第二种方式&#xff1a;读取四元…...

ORACLE-SQL性能优化(3)

2. 给优化器更明确的命令 自动选择索引 如果表中有两个以上&#xff08;包括两个&#xff09;索引&#xff0c;其中有一个唯一性索引&#xff0c;而其他是非唯一性&#xff0e; 在这种情况下&#xff0c;ORACLE将使用唯一性索引而完全忽略非唯一性索引&#xff0e; 举例: SELEC…...

3年外包裸辞,面试阿里、字节全都一面挂,哭死.....

测试员可以先在外包积累经验&#xff0c;以后去大厂就很容易&#xff0c;基本不会被卡&#xff0c;事实果真如此吗&#xff1f;但是在我身上却是给了我很大一巴掌... 所谓今年今天履历只是不卡简历而已&#xff0c;如果面试答得稀烂&#xff0c;人家根本不会要你。况且要不是大…...

JavaEE(系列16) -- 多线程(信号量与CountDownLatch)

目录 1. 信号量Semaphore 2. CountDownLatch 1. 信号量Semaphore 信号量, 用来表示 "可用资源的个数". 本质上就是一个计数器. 1.理解信号量 可以把信号量想象成是停车场的展示牌: 当前有车位 100 个. 表示有 100 个可用资源.当有车开进去的时候, 就相当于申请一个可…...

Tomcat配置https协议证书-阿里云,Nginx配置https协议证书-阿里云,Tomcat配置https证书pfx转jks

Tomcat/Nginx配置https协议证书 前言Tomcat配置https协议证书-阿里云方式一 pfx配置证书重启即可 方式二 jkspfx生成jks配置证书重启即可 Nginx配置https协议证书-阿里云实现方式重启即可 其他Tomcat相关配置例子如下nginx配置相关例子如下 前言 阿里云官网&#xff1a;https:…...

抖音定位基本原理

抖音是一款非常受欢迎的短视频分享应用程序&#xff0c;它允许用户创建和分享15秒到60秒的短视频。抖音的成功在很大程度上归功于其强大的定位技术&#xff0c;该技术可以根据用户的兴趣和位置提供个性化的内容。在本文中&#xff0c;我们将深入探讨抖音的定位技术&#xff0c;…...

【Hbase 05】Hbase表的设计原则与优化方案

这里说一下Hbase在使用过程中的表设计原则与优化方案,如果你是运维或者开发兼顾环境的工作,也许比较受用,话不多说,我们直接开始说优化的内容: 一、表设计原则 1.行键设计 行键在设计的时候要尽量的散列,例如可以考虑使用哈希、加密算法等使结果散列,这样能保证请求不会…...

行业报告 | 2022文化科技十大前沿应用趋势(上)

文 | BFT机器人 前言 Introduction 文化科技是文化科技融合过程中诞生的系列新技术成果&#xff0c;是文化强国和科技强国两大战略的交又领域。2012 年 8月&#xff0c;科技部会同中宣部、财政部、文化部、广电总局、新闻出版总署发布《文化科技创新工程纲要》&#xff0c;开启…...

实现BIM的Revit软件学习资料

实现BIM的Revit软件学习资料 一、BIM与Revit的关系二、Revit使用方法总结&#xff08;一&#xff09;快捷键&#xff08;二&#xff09;一些技巧 一、BIM与Revit的关系 链接: BIM与Revit是什么关系?看完秒懂系列&#xff01; REVIT是实现BIM理念的工具之一。 二、Revit使用方…...

09 集合框架2

集合元素的迭代方式有哪些? for循环,for-each循环(底层迭代器),迭代器 Iterator<String> it list.iterator(); while(it.hasNext()) {String ele it.next();System.out.println(ele); }并发修改集合元素异常是怎么造成的?怎么解决? 在迭代过程中使用List里面的增…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

麒麟系统使用-进行.NET开发

文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的&#xff0c;如果需要进行.NET开发&#xff0c;则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET&#xff0c;所以要进…...

PostgreSQL 与 SQL 基础:为 Fast API 打下数据基础

在构建任何动态、数据驱动的Web API时&#xff0c;一个稳定高效的数据存储方案是不可或缺的。对于使用Python FastAPI的开发者来说&#xff0c;深入理解关系型数据库的工作原理、掌握SQL这门与数据库“对话”的语言&#xff0c;以及学会如何在Python中操作数据库&#xff0c;是…...

JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除

目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作&#xf…...

Redis专题-实战篇一-基于Session和Redis实现登录业务

GitHub项目地址&#xff1a;https://github.com/whltaoin/redisLearningProject_hm-dianping 基于Session实现登录业务功能提交版本码&#xff1a;e34399f 基于Redis实现登录业务提交版本码&#xff1a;60bf740 一、导入黑马点评后端项目 项目架构图 1. 前期阶段2. 后续阶段导…...

Go 并发编程基础:select 多路复用

select 是 Go 并发编程中非常强大的语法结构&#xff0c;它允许程序同时等待多个通道操作的完成&#xff0c;从而实现多路复用机制&#xff0c;是协程调度、超时控制、通道竞争等场景的核心工具。 一、什么是 select select 类似于 switch 语句&#xff0c;但它用于监听多个通…...

Faiss vs Milvus 深度对比:向量数据库技术选型指南

Faiss vs Milvus 深度对比&#xff1a;向量数据库技术选型指南 引言&#xff1a;向量数据库的时代抉择 在AI应用爆发的今天&#xff0c;企业和开发者面临着如何存储和检索海量向量数据的重大技术选择。作为当前最受关注的两大解决方案&#xff0c;Faiss和Milvus代表了两种不同…...