使用Servlet实现单文件上传
一位朋友最近在学习JavaWeb开发,开始学习单文件上传操作,他自己尝试着去网上看一些博客教程,能明白其中大概的思路,
还是让我和他说说,如何实现单文单件上传功能。我和他说了一下大致的思路与操作步骤,主要分为前端和后端两部分来实现单文件上传操作。
Servlet版本要求必须是3.0+。
后台Java代码实现思路:
.1.继承HttpServlet,重写doPost()方法;
.2.从请求对象中获取文件上传对象Part;
注意:必须在servlet中添加@MultipartConfig注解
.3.获取文件相关信息,比如类型、大小,判断是否合法;
.4.拼接文件保存路径;
.5.获取文件对象的输入流和保存文件的输出流;
.6.读取文件内容并写入到输出流中;
.7.刷新输出流缓冲区。
前端html实现思路:
.1.创建html页面,编写form表单;
.2.设置form表单的请求方法为post方法;
.3.设置form表单的enctype属性值为"multipart/form-data";
.4.添加input标签,属性type设置为file;accept属性设置为accept=".png,.jpg",里面具体的值设置为想要上传的文件后缀名即可(可选)。
后端示例代码实现如下:
@MultipartConfig
@WebServlet("/upload")
public class UploadFileTest extends HttpServlet {
private final static String UPLOAD_PATH = "D:\\JavaWorkSpace\\course2024\\maven-demo\\src\\main\\webapp\\";
private final static List<String> FILE_TYPE = Arrays.asList(".jpg", ".png", ".gif");
private final static Long FILE_MAX_SIZE = 4 * 1024 * 1024L;
// 1.继承HttpServlet,重写doPost方法
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 2.从请求对象中获取文件上传对象Part
Part filePart = req.getPart("file");
String fileName = filePart.getSubmittedFileName();
String fileType = fileName.substring(fileName.lastIndexOf("."));
// 3.获取文件相关信息,比如类型、大小,判断是否合法
System.out.println("fileType--->" + fileType);
if(!FILE_TYPE.contains(fileType)){
CommonResult.failed(resp,"文件类型错误");
return;
}
System.out.println("size--->" + filePart.getSize());
if(filePart.getSize() > FILE_MAX_SIZE){
CommonResult.failed(resp,"文件大小超过4M");
return;
}
System.out.println("fileName--->" + fileName);
// 4.拼接文件保存路径
String savePath = UPLOAD_PATH + fileName;
System.out.println("savePath--->" + savePath);
// 5.获取文件对象的输入流和保存文件的输出流
try(BufferedInputStream bis = new BufferedInputStream(filePart.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream((new FileOutputStream(savePath)));
){
byte[] buffer = new byte[1024];
int len;
// 6.读取文件内容并写入到输出流中
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
// 7.刷新输出流
bos.flush();
} catch (Exception e){
CommonResult.failed(resp,"上传失败");
return;
}
CommonResult.success(resp,"上传完成");
}
}
说明:CommonResult是自己封装的简单的统一返回工具类。
前端示例代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="./upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" accept=".png,.jpg"/>
<br>
<input type="submit" value="上传" />
</form>
</body>
</html>
最终测试效果如下,
测试方式一:可以直接在浏览器中先请求html页面,然后选择文件,测试上传。


测试方式二:使用调试工具,比如ApiFox;测试时非常方便,可以反反复复地进行测试文件上传操作,一直到文件上传正确为止(强烈推荐)。

至此:文件上传的功能全部完成。说明:Java代码中,在进行I/O流操作时,能使用带buffer缓冲区的类尽量使用,因为它的效率会高很多。参考博客:
https://blog.csdn.net/qq_32099833/article/details/109002715
使用Servlet实现单文件上传的更多相关文章
- 【Demo Project】AjaxSubmit+Servlet表单文件上传和下载
一.背景 前段时间公司要求我做一个上传和下载固件的页面,以备硬件产品在线升级,现在我把这部分功能抽取出来作为一个Demo Project给大家分享. 话不多说,先看项目演示 --> 演示 源码 ...
- 使用jsp/servlet简单实现文件上传与下载
使用JSP/Servlet简单实现文件上传与下载 通过学习黑马jsp教学视频,我学会了使用jsp与servlet简单地实现web的文件的上传与下载,首先感谢黑马.好了,下面来简单了解如何通过使用 ...
- SpringMVC单文件上传、多文件上传、文件列表显示、文件下载(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文详细讲解了SpringMVC实例单文件上传.多文件上传.文件列表显示.文件下载. 本文工程 ...
- Struts2单文件上传原理及示例
一.文件上传的原理 表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值: 1.application/x-www-form-urlencoded:这是默认编码方式,它只处理表单域里 ...
- [转]SpringMVC单文件上传、多文件上传、文件列表显示、文件下载
一.新建一个Web工程,导入相关的包 springmvc的包+commons-fileupload.jar+connom-io.jar+commons-logging,jar+jstl.jar+sta ...
- 表单文件上传,ajax文件上传
原创链接:http://www.cnblogs.com/yanqin/p/5345562.html html代码 index.jsp(表单文件上传) <form action="sh ...
- Spring Boot2(十四):单文件上传/下载,文件批量上传
文件上传和下载在项目中经常用到,这里主要学习SpringBoot完成单个文件上传/下载,批量文件上传的场景应用.结合mysql数据库.jpa数据层操作.thymeleaf页面模板. 一.准备 添加ma ...
- spring boot:单文件上传/多文件上传/表单中多个文件域上传(spring boot 2.3.2)
一,表单中有多个文件域时如何实现说明和文件的对应? 1,说明和文件对应 文件上传页面中,如果有多个文件域又有多个相对应的文件说明时, 文件和说明如何对应? 我们在表单中给对应的file变量和text变 ...
- SpringBoot - 实现文件上传1(单文件上传、常用上传参数配置)
Spring Boot 对文件上传做了简化,基本做到了零配置,我们只需要在项目中添加 spring-boot-starter-web 依赖即可. 一.单文件上传 1,代码编写 (1)首先在 stati ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(56)-插件---单文件上传与easyui使用fancybox
系列目录 https://yunpan.cn/cZVeSJ33XSHKZ 访问密码 0fc2 今天整合lightbox插件Fancybox1.3.4,发现1.3.4版本太老了.而目前easyui 1 ...
随机推荐
- maven 私服 500 错误 nexus
扩大了硬盘就好了
- .NET Core开发实战(第25课:路由与终结点:如何规划好你的Web API)--学习笔记(下)
25 | 路由与终结点:如何规划好你的Web API 自定义约束实现了路由约束接口,它只有一个 Match 方法,这个方法传入了 Http 当前的 httpContext,route,routeKey ...
- HGAME 2024 WEEK2 Crypto Misc
CRYPTO midRSA 题目描述:兔兔梦到自己变成了帕鲁被crumbling抓去打黑工,醒来后连夜偷走了部分flag from Crypto.Util.number import * from s ...
- Pandas分析泰坦尼克号生还比例
提出问题 影响乘客生还的因素很多,这里只对乘客的性别.年龄.乘客等级.这三个因素感兴趣, 看看这四个因素是否会影响乘客的生还率. 1.性别是否会影响生还率 2.年龄是否会影响生还率 3.乘客等级会否会 ...
- JS Leetcode 263. 丑数 题解分析,来认识有趣的丑数吧
壹 ❀ 引 本题来自LeetCode263. 丑数,难度简单,题目描述如下: 给你一个整数 n ,请你判断 n 是否为 丑数 .如果是,返回 true :否则,返回 false . 丑数 就是只包含质 ...
- NC24370 [USACO 2012 Dec S]Milk Routing
题目链接 题目 题目描述 Farmer John's farm has an outdated network of M pipes (1 <= M <= 500) for pumping ...
- 【Unity3D】动画混合
1 简介 2D动画.人体模型及动画.人物跟随鼠标位置中介绍了 Aniamtion.Animator.人体模型.人体骨骼.人体动画等基础知识及人体动画的应用,本文将进一步介绍动画混合. 实现动画 ...
- C++ 多线程的错误和如何避免(1)
在终止程序之前没有使用 join() 等待后台线程 前提分析:线程分为 joinable 状态和 detached 状态 添加 .join() 这句代码的时候,就表示主线程需要等待子线程运行结束回收 ...
- 【Docker】使用 Docker 部署 .Net Core 项目 (四)
系列目录: [Docker] CentOS7 安装 Docker 及其使用方法 ( 一 ) [Docker] 使用Docker 在阿里云 Centos7 部署 MySQL 和 Redis (二) [D ...
- 谈一谈如何使用etcd中的事务
本文内容来源于自己学习时所做的记录,主要来源于文章最后的参考链接,如有侵权,请联系删除,谢谢! etcd 是一个 key/value 类型的数据库.既然我们需要存储数据,必然会面临这样一个需求,即希望 ...