一位朋友最近在学习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. Linux如何禁用透明大页

    环境: RHEL 6.5 + Oracle 11.2.0.4 RAC 1.确认透明大页是否开启 grep HugePage /proc/meminfo cat /sys/kernel/mm/redha ...

  2. delphi 下获取一个字符的 Unicode 编码

    用 Ord('万') 可以得到 "万" 字的 UniCode 的编码.

  3. NC20811 蓝魔法师

    题目链接 题目 题目描述 "你,你认错人了.我真的,真的不是食人魔."--蓝魔法师 给出一棵树,求有多少种删边方案,使得删后的图每个连通块大小小于等于k,两种方案不同当且仅当存在一 ...

  4. Js中的堆栈

    Js中的堆栈 堆heap是动态分配的内存,大小不定也不会自动释放,栈stack为自动分配的内存空间,在代码执行过程中自动释放. 栈区 在栈内存中提供一个供Js代码执行的环境,关于作用域以及函数的调用都 ...

  5. Encrypt or Decrypt sensitive data using PLSQL - DBMS_CRYPTO

    Oracle 10g introduced Transparent Data Encryption, which is about storing data physically as encrypt ...

  6. ~Keven_He的黑历史~

    "先生,我认为文言文比白话文更加简洁" "请举例" "就好像沉鱼落雁这句成语不是比白话文更加简洁吗" "沉鱼落雁是四个字,该用白话 ...

  7. Java的SPI机制实践

    Java SPI机制概述 先给出结论:"Java的SPI是一种服务发现机制,用于约定接口和动态发现实现类,体现了分层解耦的思想". Java的SPI机制常用于框架扩展或组件替换,最 ...

  8. SDL开发笔记(三):使用SDL渲染窗口颜色和图片

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

  9. 如何渲染最原始的yuv视频数据?

    一.整体思路 我们在用纹理增加细节那篇文章中提到过,要将图片渲染在屏幕上,首先要拿到图片的像素数组数据,然后将像素数组数据通过纹理单元传递到片段着色器中,最后通过纹理采样函数将纹理中对应坐标的颜色值采 ...

  10. Android Studio 导入自己编译的 framework jar

    网上的文章大多是 Android Studio 2.x 环境,实行起来,坑比较多. 本文适用于 Android Studio 3.x 及以上,亲测可行. 一.编译生成 framework.jar 包 ...