Servlet上传文件

这是一个Maven项目

tomcat版本:9.0.107

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>FuncExt</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>FuncExt Maven Webapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/commons-io/commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.20.0</version></dependency><!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.6.0</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.3</version></dependency></dependencies><build><finalName>FuncExt</finalName></build>
</project>

Servlet.java

package Servlet;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;public class Servlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//判断上传的文件是普通表单还是带文件的表单if(!ServletFileUpload.isMultipartContent(req)){System.out.println("普通表单");return;}//创建上传文件的保存路径,在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();}try{//创建DiskFileItemFactory对象,处理文件上传路径或者大小限制DiskFileItemFactory factory = getDiskFileItemFactory(tmpFile);//获取ServletFileUploadServletFileUpload upload = getServletFileUpload(factory);//处理上传的文件String msg = uploadParseRequest(upload,req,uploadPath);//servlet请求转发消息req.setAttribute("msg",msg);req.getRequestDispatcher("info.jsp").forward(req,resp);} catch (Exception e){e.printStackTrace();}System.out.println("文件保存路径:" + uploadPath);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}public static DiskFileItemFactory getDiskFileItemFactory(File file){DiskFileItemFactory factory = new DiskFileItemFactory();//通过这个工厂设置一个缓冲区,上传的文件大于这个缓冲区的话,将它放到临时文件里factory.setSizeThreshold(1024 * 1024);// 1Mfactory.setRepository(file); //临时文件的保存目录return factory;}public static ServletFileUpload getServletFileUpload(DiskFileItemFactory diskFileItemFactory){ServletFileUpload upload = new ServletFileUpload(diskFileItemFactory);//监听文件上传进度upload.setProgressListener(new ProgressListener() {@Overridepublic void update(long l, long l1, int i) {System.out.println("总大小:" + l1 + "已上传:" + l);}});upload.setHeaderEncoding("UTF-8");upload.setFileSizeMax(1024 * 1024 * 10);upload.setSizeMax(1024 * 1024 * 10);return upload;}public static String uploadParseRequest(ServletFileUpload upload,HttpServletRequest request,String uploadPath) throws Exception{String msg = "";//把前端请求解析,分成一个一个文件List<FileItem> fileItems = upload.parseRequest(request);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.getName();System.out.println("上传的文件名:" + uploadFileName);if(uploadFileName == null || uploadFileName.trim().equals("")){continue;}String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);String fileExtName = fileName.substring(fileName.lastIndexOf(".") + 1);System.out.println("文件信息【件名:" + fileName + "---文件类型" +  fileExtName + "】");String uuidPath = UUID.randomUUID().toString();String realPath = uploadPath + "/" + uuidPath;//给每个文件创建一个对应的文件夹;File realPathFile = new File(realPath);if(!realPathFile.exists()){realPathFile.mkdir();}InputStream inputStream = fileItem.getInputStream();FileOutputStream fileOutputStream = new FileOutputStream(realPath + "/" + fileName);byte[] b = new byte[1024 * 1024];int len = 0;while((len = inputStream.read(b)) != -1){fileOutputStream.write(b,0,len);}fileOutputStream.close();inputStream.close();msg = "文件上传成功!";fileItem.delete();}}return msg;}
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"metadata-complete="true"><servlet><servlet-name>file</servlet-name><servlet-class>Servlet.Servlet</servlet-class></servlet><servlet-mapping><servlet-name>file</servlet-name><url-pattern>/upload</url-pattern></servlet-mapping>
</web-app>

index.jsp

<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<body><form action =  "${pageContext.request.contextPath}/upload" enctype="multipart/form-data" method="post">上传用户: <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>

info.jsp

<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<body>${msg}</body>
</html>

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

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

相关文章

cocos creator 3.8 - 精品源码 -《汉中汉:汉字中的字》

cocos creator 3.8 - 精品源码 - 超级文字大师游戏介绍功能介绍免费体验下载开发环境游戏截图免费体验游戏介绍 《汉中汉&#xff1a;汉字中的字》、找汉字&#xff0c;是一款从文字中的笔画找出可以组成新汉字的小游戏。比如&#xff1a;“王”字中的笔画就可以组成&#xff…

手机端的音视频界面或者图片文档界面共享给大屏

手机端的音视频界面或者图片文档界面共享给大屏&#xff0c;可通过无线投屏和有线连接等技术手段实现&#xff0c;以下是具体介绍&#xff1a;无线投屏&#xff1a;AirPlay&#xff1a;这是苹果公司开发的无线共享协议。苹果手机可通过上滑或下拉调出控制中心&#xff0c;点击 …

Linux内存管理系统性总结

Linux内存管理系统性总结 内存管理核心架构图 #mermaid-svg-hKRdgBBYXZTiost8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hKRdgBBYXZTiost8 .error-icon{fill:#552222;}#mermaid-svg-hKRdgBBYXZTiost8 .error-t…

MySQL 运算符实战:9 道经典练习题解析

MySQL 运算符实战&#xff1a;9 道经典练习题解析 运算符是 MySQL 查询的 “灵魂”&#xff0c;灵活运用各类运算符能让数据筛选更加精准高效。本文通过 9 道实战练习题&#xff0c;详解逻辑运算符、比较运算符及模糊匹配的用法&#xff0c;帮你快速掌握运算符的核心应用场景。…

【R语言】更换电脑后,如何在新设备上快速下载原来设备的 R 包?

【R语言】更换电脑后&#xff0c;如何在新设备上快速下载原来设备的 R 包&#xff1f; 在日常使用 R 进行数据分析时&#xff0c;我们往往会安装很多包&#xff08;packages&#xff09;&#xff0c;一旦更换电脑&#xff0c;手动一个一个重新安装会非常麻烦。本文介绍一种简单…

如何在 Ubuntu 24.04 或 22.04 LTS 上安装 PowerShell

在本教程中,我们将学习如何在 Ubuntu 24.04 Noble 或 22.04 Jammy JellyFish Linux 中通过命令终端安装 Microsoft Windows PowerShell。 Windows PowerShell 既是一个命令行外壳程序,也是一种脚本语言。它拥有超过 130 个遵循一致语法和命名约定的命令行工具,称为 cmdlet(…

基于支持向量机的数据回归预测(libsvm) SVM

一、作品详细简介 1.1附件文件夹程序代码截图 全部完整源代码&#xff0c;请在个人首页置顶文章查看&#xff1a; 学行库小秘_CSDN博客​编辑https://blog.csdn.net/weixin_47760707?spm1000.2115.3001.5343 1.2各文件夹说明 1.2.1 main.m主函数文件 这段 MATLAB 代码实现…

Flowith-节点式GPT-4 驱动的AI生产力工具

本文转载自&#xff1a;Flowith-节点式GPT-4 驱动的AI生产力工具 - Hello123工具导航 ** 一、节点式 AI 工作流革新者&#xff1a;Flowith 深度解析 二、产品核心定位 Flowith 是一款基于 GPT-4 Turbo 的节点式 AI 生产力工具&#xff0c;突破传统单线程聊天模式&#xff0c…

MySQL的事务日志:

目录 redo&#xff08;重做日志&#xff09;&#xff1a; 特点&#xff1a; 组成&#xff1a; 整体流程&#xff1a; redo log buffer与redo log file之间的刷盘策略&#xff1a; 异步刷盘&#xff1a; 同步刷盘&#xff1a; 拆中策略&#xff1a; undo&#xff08;回…

JavaScript 中 throw error 与 throw new Error(error) 的用法及区别,分别适合什么场景使用?

JavaScript 中 throw error 与 throw new Error(error) 的用法及区别 在 JavaScript 中&#xff0c;throw 关键字用于抛出异常。当代码遇到某些错误或异常情况时&#xff0c;可以通过抛出错误来通知程序&#xff0c;方便后续的错误处理。尽管 throw 的使用看似简单&#xff0c…

鸿蒙自带组件效果大全

图形变换-视效与模糊-通用属性-ArkTS组件-ArkUI&#xff08;方舟UI框架&#xff09;-应用框架 - 华为HarmonyOS开发者 注意:找到需求效果之后先对一下版本 视距 图像效果 图片裁剪 颜色渐变 前景属性设置 外描边设置: 视效设置: 组件内容模糊 运动模糊 点击回弹效果…

ISP算法如何优化提升成像质量

ISP算法通过多维度技术协同优化成像质量&#xff0c;核心优化路径如下&#xff1a;一、降噪与细节增强‌AI驱动降噪‌深度学习模型实时识别噪点模式&#xff0c;暗光场景信噪比提升5倍以上&#xff0c;同时保留纹理细节。时空域联合降噪技术抑制运动模糊&#xff0c;鬼影消除率…

单例模式及优化

单例模式是一种创建型设计模式&#xff0c;其核心是确保一个类在程序中只能存在唯一实例&#xff0c;并提供一个全局访问点。这种模式适用于需要集中管理资源&#xff08;如日志、配置、连接池&#xff09;的场景&#xff0c;避免资源冲突和重复创建的开销。 一、介绍 类型 单例…

Dockerfile优化指南:利用多阶段构建将Docker镜像体积减小90%

更多如果你已经跟随我们之前的教程&#xff0c;亲手将自己的应用装进了Docker这个“魔法盒子”&#xff0c;那你可能很快就会遇到一个幸福但又尴尬的烦恼&#xff1a;你亲手构建的Docker镜像&#xff0c;竟然像一个塞满了石头和棉被的行李箱&#xff0c;臃肿不堪&#xff0c;笨…

英文PDF翻译成中文怎么做?试试PDF翻译工具

在全球化快速发展的时代&#xff0c;跨语言交流变得愈发频繁&#xff0c;无论是学术研究、商务合作还是日常学习&#xff0c;都离不开一个高效、准确的翻译工具。尤其是对于PDF文件的翻译需求&#xff0c;更是日益增长。今天&#xff0c;就让我们一起深入了解几款在PDF翻译领域…

macOS使用brew切换Python版本【超详细图解】

目录 一、更新Homebrew仓库 二、安装pyenv 三、将pyenv添加到bash_profile文件中 四、使.bash_profile文件的更改生效 五、安装需要的Python版本 六、设置全局使用的Python版本 七、检查Python版本是否切换成功 pyenv常用命令 一、更新Homebrew仓库 brew update 这个…

[矩阵置零]

初始思路分析 这段代码实现了将矩阵中元素为0的行和列全部置零的功能。主要思路是使用标记数组记录需要置零的行和列。以下是详细分析&#xff1a; 1. 初始化阶段 int m matrix.size(); int n matrix[0].size(); vector<bool> row(m), col(n);获取矩阵的行数m和列数n创…

redis-集成prometheus监控(k8s)

一. 简介&#xff1a; 关于redis的简介和部署&#xff0c;可以参考单独的文章redis-sentinel基础概念及部署-CSDN博客&#xff0c;这里就不细说了。这里只讲讲如何在k8s中部署export并基于prometheus做redis的指标采集。 二. 实现方式&#xff1a; 首先我们需要先部署exporter…

OVS:ovn为什么默认选择Geneve作为二层隧道网络协议?

首先确认 Geneve 是一种封装协议,可能提供比 VLAN 或 VXLAN 更灵活的扩展能力,这对 OVN 的多租户场景很重要。可能需要支持更多元数据字段,比如携带网络策略信息,这符合 SDN 集中控制的需求。 性能方面需要考虑封装效率和硬件支持情况,虽然 Geneve 头部稍大,但现代网卡的…

grep命令要点、详解和示例

grep技术要点 1) 工作模型&#xff08;3 件事&#xff09; 输入&#xff1a;从文件或标准输入&#xff08;-&#xff09;读入&#xff0c;一次按“行”处理&#xff08;除非用 -z 改成以 NUL 作为“行”分隔&#xff09;。匹配&#xff1a;把每一行拿去和模式&#xff08;patte…