Java实现文件上传功能
目录
1、准备工作
2、注意事项
3、jsp页面代码
4、Servlet
5、注册Servlet
1、准备工作
导入依赖:commons-fileupload和commons-io
2、注意事项
①为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如WEB-INF目录下
②为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名(时间戳、uuid)
③要限制上传文件的最大值
④可以限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法
3、jsp页面代码
注意:form表单要加上 enctype="multipart/form-data"
并且method一定是post,因为get有大小限制
<html>
<body><form action="${pageContext.request.contextPath}/upload.do" method="post" enctype="multipart/form-data">上传用户:<input type="text" name="username"><br/><p><input type="file" name="file1"></p><p><input type="file" name="file2"></p><p><input type="submit"> | <input type="reset"></p>
</form></body>
</html>
4、Servlet
//判断上传的文件是普通表单,还是带文件的表单if(!ServletFileUpload.isMultipartContent(req)){return;//终止方法运行,说明这是一个普通表单,直接返回}try {//创建上传文件袋保存路径,建议在WEB-INF路径下,安全,用户无法直接访问上传的文件String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");File uploadFile = new File(uploadPath);if(!uploadFile.exists()){uploadFile.mkdir();//创建这个目录}//缓存,临时文件//临时路径,假如文件超过了预期的大小。我们就把他放到一个临时文件中,过几天自动删除,或者提醒用户转存为永久String tmpPath = this.getServletContext().getRealPath("/WEB-INF/tmp");File tmpFile = new File(tmpPath);if(!tmpFile.exists()){tmpFile.mkdir();//创建这个临时目录}
1、创建DiskFileItemFactory对象
//处理上传的文件,一般都需要通过流来获取,我们可以使用req.getInputStream(),原生态的文件上传流获取,十分麻烦//建议使用Apache的文件上传组件来实现,common-fileupload,他需要依赖于commons-io组件//1、创建DiskFileItemFactory对象:处理文件上传路径或者大小限制的DiskFileItemFactory factory = new DiskFileItemFactory();
2、 获取ServletFileUpload
//2、获取ServletFileupload:监听文件上传进度、处理乱码问题、设置单个文件的最大值、设置总共能够上传文件的大小ServletFileUpload upload = new ServletFileUpload();
3、处理上传的文件
//3、处理上传的文件//把前端请求解析,封装成一个FileItem对象List<FileItem> fileItems = upload.parseRequest(req);for (FileItem fileItem : fileItems) {//判断上传的文件是普通表单,还是带文件的表单if(fileItem.isFormField()){//普通表单String name = fileItem.getFieldName();String value = fileItem.getString("UTF-8");System.out.println(name+":"+value);}else{//文件//=========================处理文件============================////拿到文件名字String uploadFileName = fileItem.getFieldName();System.out.println("上传的文件名:"+uploadFileName);//可能存在文件名不合法的情况if(uploadFileName.trim().equals("") || uploadFileName==null){continue;}//获取上传的文件名String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);//获取文件的后缀名String fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);//可以使用uuid保证文件名唯一//UUID.randomUUID(),随机生成一个唯一的通用码String uuidPath = UUID.randomUUID().toString();//=========================存放地址============================//String realPath = uploadPath+"/"+uuidPath;//给每个文件创建一个对应的文件夹File realPathFile = new File(realPath);if(!realPathFile.exists()){realPathFile.mkdir();}//=========================文件传输============================////获得文件上传的流InputStream inputStream = fileItem.getInputStream();//创建一个文件输出流FileOutputStream fos = new FileOutputStream(realPath + "/" + fileName);//创建一个缓冲区byte[] buffer = new byte[1024*1024];//判断是否读取完毕int len = 0;//如果大于0,说明还存在数据while((len = inputStream.read(buffer))>0){fos.write(buffer,0,len);}//关闭流fos.close();inputStream.close();//上传成功,清除临时文件fileItem.delete();}}} catch (FileUploadException e) {throw new RuntimeException(e);}
5、注册Servlet
相关文章:

Java实现文件上传功能
目录 1、准备工作 2、注意事项 3、jsp页面代码 4、Servlet 5、注册Servlet 1、准备工作 导入依赖:commons-fileupload和commons-io 2、注意事项 ①为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如WEB-INF目录下 ②为…...

Leetcode|24. 两两交换链表中的节点 ● 19.删除链表的倒数第N个节点 ● 面试题 02.07. 链表相交 ● 142.环形链表II
24. 注意:涉及头节点的修改或者删除时,最好设置一个虚拟的头结点,方便简化代码,不必进行是否为头节点的的判断,简化code class Solution { public:ListNode* swapPairs(ListNode* head) {ListNode* dummyHead new Li…...

OpenCV学习笔记5——图像的数值计算
目录 一、简单数值计算 二、opencv中提供函数进行计算 三、cv2.addWeighted 一、简单数值计算 在opencv中,我们有许多可以获取图像各类数值的办法,许多函数能获得各种方面的数据。但如果我们什么都不用,仅仅对图像上每一个点做加法运算会…...
P3137 [USACO16FEB] Circular Barn S
P3137 [USACO16FEB] Circular Barn S 思路:数据范围为O(n^2)那么因此我们可以暴力,那么如何进行构造呢?首先假设一头奶牛在a,一头在b,如果要使一个到b,另一个到c,(a<b<c)&…...
yocto编辑软件包-devtool的使用方法
之前用了很多次devtool,总是忘记用法,故此记录一下。 假设你有一个软件包名叫foo,并且已经下载编译过,需要修改它的源码并生成patch 生成修改工作区 devtool modify foo modify命令会将foo的源码压缩包解压到build/workspace/so…...

51单片机快速入门之 串行通信 2024/10/21
51单片机快速入门之 串行通信 并行通信: 好处:传输快 适合短距离通信弊端:占用大量io 接线形式为8对8 串行通信 异步通信: 数据一帧一帧传送,传输完一帧之后,可继续或者等待(等待时为高电平) 其帧细分为(图片来源) 起始位:数据帧开始,一定为 0 外部设备只有接受到 0 之后…...

webpack 老项目升级记录:node-sass 规定的 node v8 提升至支持 node v22
老项目简介 技术框架 vue 2.5.17webpack 4.16.5"webpack-cli": "3.1.0""node-sass": "^4.7.2" 几个阶段 第一步:vue2 升级到最新 第一步:升级 vue2 至最新版本,截止到目前(2024-10-…...

【wpf】08 xml文件的存取操作
在使用wpf编程过程中,会用到xml的配置文件,实现对其读取和存储的操作是必须的。 1 xml说明 可扩展标记语言 (Extensible Markup Language, XML) ,标准通用标记语言的子集,可以用来标记数据、定义数据类型,是一种允许…...
即时通讯代码优化
在线用户逻辑修复 在进行测试时,发现当前代码有个问题,如果test1在服务器进行连接,本地的test2给test1发消息,虽然test1能收到服务器上的信息,但是本地服务日志中会报teset1不在线,需要对该种情况进行修复…...

jmeter学习(8)界面的使用
1、新建test plan 3、 打开文件 4、保存 5、剪切 6、复制 7、粘贴 8、所有线程组展开 9、所有线程组收缩 10、置灰,操作后无法使用 11、执行 13、清空当前线程组结果 14、清空所有线程组结果 15、函数助手 搜索,可以用于搜索某个请求&#x…...

记录一次hiveserver2卡死(假死)问题
问题描述 给开发人员开通了个账号,连接hive进行查询,后来发现,hive服务有时候会卡死,查询不了,连不上(所有账号/客户端都连不上hive),但在chd里面看监控,服务器资源状态…...
【ios】在 SwiftUI 中实现可随时调用的加载框
在 SwiftUI 项目中实现一个自定义的加载框(loading)功能,可以在任意位置调用,以便显示加载动画或者进度条。下面的教程将详细讲解如何创建一个可复用的 Loading 组件,并通过通知机制控制其显示和隐藏。 先上效果&…...
字符、解释型语言、编程语言的互操作、输出
字符 同样是1,有人看到的是数字,有人看到的是字符,还有人看到的是一个小目标。 不同语言的字符 正则表达式把字符分成普通字符和元字符,元字符为了搭配匹配。比如.代表任意非换行字符,这对于通配很简便,用\…...

基于Python的自然语言处理系列(39):Huggingface中的解码策略
在自然语言生成任务中,如何选择下一步的单词或者词语对生成的文本质量影响巨大。Huggingface 提供了多种解码策略,可以在不同的场景下平衡流畅度、创造力以及生成效率。在这篇文章中,我们将逐步介绍 Huggingface 中的几种常见解码策略&#x…...

如何将视频格式转为mp4?好好看看下面这几个方法
如何将视频格式转为mp4?在数字化时代,视频已成为信息传播与娱乐消遣的重要载体。无论是学习、工作还是日常生活,我们几乎每天都会接触到各式各样的视频内容。然而,不同设备、平台或软件生成的视频文件往往采用不同的编码格式&…...

景区智慧公厕系统,监测公厕异味,自动清洁除臭
随着旅游业的快速发展,景区的公共厕所管理成为提升游客体验的重要环节。传统的公厕管理方式存在诸多不足,如卫生条件差、异味严重等问题。为了改善这些问题,许多景区开始采用智慧公厕系统。这种系统能够实时监测公厕内的异味,并自…...
GitLab CVE-2024-6389、CVE-2024-4472 漏洞解决方案
极狐GitLab 近日发布安全补丁版本17.3.2, 17.2.5, 17.1.7,修复了17个安全漏洞,本分分享其中两个漏洞 CVE-2024-6389、CVE-2024-4472 两个漏洞详情及解决方案。 极狐GitLab 正式推出面向 GitLab 老旧版本免费用户的专业升级服务,为 GitLab 老…...
hashCode的底层原理
HashCode是计算机科学中一个广泛使用的概念,特别是在Java等编程语言中,它扮演着重要的角色。为了详细解释hashCode的底层原理,以下从几个方面进行阐述: 一、hashCode的基本概念 HashCode,即哈希码,是一个将…...

hadoop_hdfs详解
HDFS秒懂 HDFS定义HDFS优缺点优点缺点 HDFS组成架构NameNodeDataNodeSecondary NameNodeClient NameNode工作机制元数据的存储启动流程工作流程 Secondary NameNode工作机制checkpoint工作流程 DataNode工作机制工作流程数据完整性 文件块大小块太小的缺点块太大的缺点 文件写入…...

【Linux】Linux命令行与环境变量
1.命令行 前⾯写C语⾔时,很少关注过 main 函数的参数,也没有考虑过 main 为什么会有参 数。 实际上在C语⾔中, main 函数⼀共有三个参数,在命令⾏部分先关注前两个参数: 1. argc:表示 main 函数接收到参…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...

实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...