servlet(二)文件的上传

2023-10-26

servlet实现文件的上传

文件上传是一个web应用常见的功能
比如:QQ头像,就使用了上传。
邮箱中也有附件的上传和下载功能。
OA系统中审批有附件材料的上传。

1.1前端需要有个form表单标签

method=post请求

(因为post请求是没有长度限制,get请求的话有长度限制,因此form表单在上传文件时要使用post请求)

1.2 form 标签的 encType 属性值必须为 multipart/form-data 值

(encType=multipart/form-data 表示提交的数据,以多段(每一个表单项一个数据段)的形式进行拼
接,然后以二进制流的形式发送给服务器)

1.3 form 标签中使用 input type=file 添加上传的文件

在这里插入图片描述

在这里插入图片描述

1.4 编写服务器代码(Servlet 程序)接收,处理上传的数据。在这里插入图片描述

由于自己写解析很麻烦 ,于是就可以使用其他写好的工具

commons-fileupload.jar 需要依赖 commons-io.jar 这个包,所以两个包我们都要引入。
用来解析文件
解析上传的数据的代码:

/**
* 用来处理上传的数据
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
//1 先判断上传的数据是否多段数据(只有是多段的数据,才是文件上传的)
if (ServletFileUpload.isMultipartContent(req)) {
// 创建 FileItemFactory 工厂实现类
FileItemFactory fileItemFactory = new DiskFileItemFactory();
// 创建用于解析上传数据的工具类 ServletFileUpload 类
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
try {
// 解析上传的数据,得到每一个表单项 FileItem
List<FileItem> list = servletFileUpload.parseRequest(req);
// 循环判断,每一个表单项,是普通类型,还是上传的文件
for (FileItem fileItem : list) {
if (fileItem.isFormField()) {
// 普通表单项
System.out.println("表单项的 name 属性值:" + fileItem.getFieldName());
// 参数 UTF-8.解决乱码问题
System.out.println("表单项的 value 属性值:" + fileItem.getString("UTF-8"));
} else {
// 上传的文件
System.out.println("表单项的 name 属性值:" + fileItem.getFieldName());
System.out.println("上传的文件名:" + fileItem.getName());
fileItem.write(new File("e:\\" + fileItem.getName()));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

思路就是:
先判断上传的问题件对否是多段数据
是:创建new ServletFileUpload()对象
解析上传的数据,得到每一个表单项 FileItem
List list = servletFileUpload.parseRequest(req);
for循环遍历列表
循环判断,每一个表单项,是普通类型,还是上传的文件fileItem.isFormField()
如果是普通表单项就直接获取name属性值和value属性值
否则为上传的文件保存到某个文件夹下
在这里插入图片描述在这里插入图片描述
但是如果文件名称为中文 则会出现乱码
如何解决?
在这里插入图片描述
只需要在请求设置一下字符编码为utf-8

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

servlet(二)文件的上传 的相关文章

随机推荐

  • 多线程与高并发编程进阶(二)

    前言 前文多线程与高并发入门中 已经介绍了多线程编程的目的以及实际应用中可能会遇到的问题 本文接着叙述关于多线程并发机制的底层原理 volatile以及synchronized 一般来说 Java代码从编写到最后的执行会经历以下的过程 Ja
  • 二叉树的基本操作(1)

    结点类型 struct TreeNode char val struct TreeNode l r TreeNode int x val x l nullptr r nullptr 新建一个类 名为solution 相关函数都放在这里面调用
  • 分类预测

    分类预测 MATLAB实现LSSVM 最小二乘支持向量机 分类 目录 分类预测 MATLAB实现LSSVM 最小二乘支持向量机 分类 最小二乘法 最小二乘支持向量机 程序设计 主程序 子程序 拓展知识 参考资料 致谢 最小二乘法 最小二乘法
  • 利用python实现163邮箱邮件的自动删除

    问题 163邮箱收信箱大量邮件无法批量删除 解决思路 利用python控制鼠标实现邮件自动删除 利用python的pyautogui实现鼠标的控制 import pyautogui as pg screenWidth screenHeigh
  • 海洋浮标数据显示系统

    R语言是现今世界上数据处理和可视化领域非常流行的数据处理语言 其类似于matlab 是开源的 功能强大的数据处理工具 Oracle是企业级的数据库 能够存储大量数据并且方便管理和使用 本文主要是基于R与oracle对美国国家海洋与大气管理局
  • 老师给我的指点——深刻剖析了我

    今天上午找导师有事 导师坐下来和我聊了聊 他说 就他的观察 我有以下几个方面的问题 一 感觉我在做事上总是欠缺那么一点东西 就是说 给我的事情 我是能做完也让别人没法批评我 但是总感觉欠缺一点东西 相比师妹 每次给任务1分可以做完1 2分
  • 函数式编程实例WordCount(林子雨老师慕课代码) 由于文件引入的问题之前报过Exception in thread “main“ java.lang.NullPointerExcept(已解决)

    函数式编程实例WordCount 数据文件目录 文件内容 刚开始在写文件的时候以为val dirfile new File data 这一行写的是具体文件 于是我写成了这样 运行之后始终给我报空指针异常 后面仔细研究文件 原来val dir
  • Linux 系统启动过程

    简介 Linux 系统启动过程大致分为5个阶段 1 内核的引导 2 运行 init 3 系统初始化 4 建立终端 5 用户登录系统 内核引导 计算机通电后 首先会进行 BIOS 开机自检 然后根据BIOS中设置的启动设备 一般是硬盘 来启动
  • Go开发 之 单端口转发到多个端口

    文章目录 1 背景 2 正题 3 源码 4 配置 5 效果 1 背景 运维和我提到这个需求的时候 我先是一愣 第一时间想到的是nginx 然后运维说nginx没有这个功能 之所以选择用go语言 主要两点 静态语言性能够用 不用部署其它包 可
  • 【linux操作系统知识】虚拟地址中:.data段和.bss段

    虚拟地址中 data段和 bss段 data段 为数据段 用来存放程序中已初始化并且初始化不为0的全局变量和静态局部变量 数据段属于静态内存分布 可读可写 bss段 称为未初始化段 用来存放未初始化或者初始化为0的全局变量和静态局部变量 b
  • MATLAB数据分析

    MATLAB数据分析 在实际应用中 经常需要对各种数据进行统计处理 以便为科学决策提供依据 这些统计处理包括求数据序列的最大值和最小值 和与积 平均值和中值 累加和与累乘积 标准方差和相关系数 排序等 MATLAB提供了相关的函数来实现 目
  • flutter实现可缩放可拖拽双击放大的图片功能

    flutter drag scale 可缩放可拖拽的功能 可实现图片或者其他widget的缩放已经拖拽 并支持双击放大的功能 我们知道官方提供了双击缩放 但是不支持拖拽的功能 我们要实现向百度地图那样可以缩放又可以拖拽的功能 官方的方法就不
  • unicloud 发布后小程序提示连接本地调试服务失败,请检查客户端是否和主机在同一局域网下

    1 hbuildx中小程序控制台切换连接方式 连接云端云函数 2 本地调试的话 连接本地云函数 并确定是否启动
  • 在eclipse的project explorer不小心删除了servers文件夹解决办法

    在eclipse的project explorer不小心删除了servers文件夹 解决办法 在Servers中删除tomcat 重新关联link一下就恢复了 但是得把build path的旧的server文件夹remove 再重新添加
  • 我们研究了853场世界杯比赛,发现了这几条稳赔不赚的竞猜攻略

    本文转载自大数据 ID hzdashuju 导读 世界杯开赛以来 据数据叔不完全统计 身边有66 6 的小伙伴上了天台 其中22 2 的人买了阿根廷赢 22 2 的人买了德国赢 还有22 2 的人买了巴西赢 剩下那33 4 的人 总是在问数
  • Unity性能优化

    Unity性能优化专栏第一期 目录 Unity性能优化专栏第一期 橙子前言 一 性能优化概念 Unity 3D 游戏优化瓶颈归根结底是开发过程中内存分配和使用不佳的结果 1 它们承担了它们这个级别不应该有的压力 2 它们没有受到应有的尊重
  • Arduino串口通信

    文章目录 通信类型 Arduino串口通信 硬串口 软串口 通信类型 通信是用来在不同电子设备之间交换数据用的技术 其实就是要实现不同电子设备之间的 通讯对话 Arduino串口通信 Arduino采用USART通信模式 可以有硬串口 软串
  • unity中动画控制器基础知识

    动画控制器的创建 1 在工程视图里 Create Aniamtor Contorller动画控制器 命名 双击 这时会在Animator视图中显示默认有三种状态 Entry 进入状态 Any State 任意状态 Exit 退出状态 如何添
  • OpenWRT 分流DNS的设置

    文章出处 OpenWRT 分流DNS的设置 Issue 57 luckyyyyy blog 我自己根据实际需要基于上方的链接内容进行了相关补充 OpenWRT配置IPv6的方法参考如下文章 OpenWRT IPv6 NAT配置 目前还是有许
  • servlet(二)文件的上传

    servlet实现文件的上传 文件上传是一个web应用常见的功能 比如 QQ头像 就使用了上传 邮箱中也有附件的上传和下载功能 OA系统中审批有附件材料的上传 1 1前端需要有个form表单标签 method post请求 因为post请求