一位朋友最近在学习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实现单文件上传的更多相关文章

  1. 【Demo Project】AjaxSubmit+Servlet表单文件上传和下载

    一.背景 前段时间公司要求我做一个上传和下载固件的页面,以备硬件产品在线升级,现在我把这部分功能抽取出来作为一个Demo Project给大家分享. 话不多说,先看项目演示 --> 演示  源码 ...

  2. 使用jsp/servlet简单实现文件上传与下载

    使用JSP/Servlet简单实现文件上传与下载    通过学习黑马jsp教学视频,我学会了使用jsp与servlet简单地实现web的文件的上传与下载,首先感谢黑马.好了,下面来简单了解如何通过使用 ...

  3. SpringMVC单文件上传、多文件上传、文件列表显示、文件下载(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文详细讲解了SpringMVC实例单文件上传.多文件上传.文件列表显示.文件下载. 本文工程 ...

  4. Struts2单文件上传原理及示例

    一.文件上传的原理 表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值: 1.application/x-www-form-urlencoded:这是默认编码方式,它只处理表单域里 ...

  5. [转]SpringMVC单文件上传、多文件上传、文件列表显示、文件下载

    一.新建一个Web工程,导入相关的包 springmvc的包+commons-fileupload.jar+connom-io.jar+commons-logging,jar+jstl.jar+sta ...

  6. 表单文件上传,ajax文件上传

    原创链接:http://www.cnblogs.com/yanqin/p/5345562.html html代码  index.jsp(表单文件上传) <form action="sh ...

  7. Spring Boot2(十四):单文件上传/下载,文件批量上传

    文件上传和下载在项目中经常用到,这里主要学习SpringBoot完成单个文件上传/下载,批量文件上传的场景应用.结合mysql数据库.jpa数据层操作.thymeleaf页面模板. 一.准备 添加ma ...

  8. spring boot:单文件上传/多文件上传/表单中多个文件域上传(spring boot 2.3.2)

    一,表单中有多个文件域时如何实现说明和文件的对应? 1,说明和文件对应 文件上传页面中,如果有多个文件域又有多个相对应的文件说明时, 文件和说明如何对应? 我们在表单中给对应的file变量和text变 ...

  9. SpringBoot - 实现文件上传1(单文件上传、常用上传参数配置)

    Spring Boot 对文件上传做了简化,基本做到了零配置,我们只需要在项目中添加 spring-boot-starter-web 依赖即可. 一.单文件上传 1,代码编写 (1)首先在 stati ...

  10. ASP.NET MVC5+EF6+EasyUI 后台管理系统(56)-插件---单文件上传与easyui使用fancybox

    系列目录 https://yunpan.cn/cZVeSJ33XSHKZ  访问密码 0fc2 今天整合lightbox插件Fancybox1.3.4,发现1.3.4版本太老了.而目前easyui 1 ...

随机推荐

  1. Matter开发,看这一篇就够了

    1. Matter介绍 Matter(以前称为 Project Connected Home over IP 或 Project CHIP)是由CSA联盟制定的一个应用层面的标准,旨在打造一个统一的智 ...

  2. 深入读懂 Kafka集群

    前言 概述 Kafka是一个多分区.多副本的分布式流处理平台,以高吞吐.可持久化.可水平扩展.支持流数据处理等多种特性被广泛使用. 应用场景 (1)缓冲削峰:有利于解决生产消息和消费消息的处理速度不一 ...

  3. 【译】IEEE白皮书 6G 太赫兹技术的基本原理 2023版

    第一章 简介 太赫兹波是介于微波和光波之间的光谱区域,频率从 0.1THz ~ 10THz 之间,波长在 3mm ~ 30μm 之间.提供大块连续的频带范围以满足对 Tbit/s 内极高数据传输速率的 ...

  4. SSD寻址单元IU对寿命的影响——古猫先生存储随笔转载

    SSD寻址单元IU对寿命的影响有多大? 原创 古猫先生 存储随笔 2024-01-30 08:30 发表于浙江 [转载]SSD寻址单元IU对寿命的影响有多大? (qq.com) 随着存储技术的不断进步 ...

  5. 从零开始手写缓存框架(12)redis expire 过期的随机特性详解及实现

    前言 java从零手写实现redis(一)如何实现固定大小的缓存? java从零手写实现redis(二)redis expire 过期原理 java从零手写实现redis(三)内存数据如何重启不丢失? ...

  6. Java操作EasyExcel实现导入导出入门

    介绍 EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单.节省内存著称.EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从 ...

  7. junit使用stub进行单元测试

    stub是代码的一部分,我们要对某一方法做单元测试时,可能涉及到调用第三方web服务.假如当前该服务不存在或不可用咋办?好办,写一段stub代码替代它. stub 技术就是把某一部分代码与环境隔离起来 ...

  8. win32-封装BeginPaint

    Graphics* StartPaint(HWND win, HDC* hdc, PAINTSTRUCT* ps) { *hdc = BeginPaint(win, ps); return new G ...

  9. Taro兼容h5的一些小问题

    背景:先做了小程序,现在需要兼容h5 问题一:Image组件mode属性设置为aspectFill在h5上没效果 解决方法:给img加样式 object-fit: cover (例子如下) // js ...

  10. OpenCV开发笔记(六十二):红胖子8分钟带你深入了解亚像素角点检测(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...