简单介绍:

首先获取文件上传需要的jar包,在官网中找到:Apache Commons FileUpload 和 Apache Commons IO两个jar包下载后,解压,得到两个jar包,并复制到web下面的lib目录中:

经过一段时间的学习,光外部依赖包就已经这么多了。如果使用的maven,可以之前去官网复制坐标到pom.xml文件中即可。

阿帕奇项目列表 (apache.org)

上传文件需要用到的API:

ServletFileUpload:文件上传的核心类,主要作用是判断上传的文件是否为multipart/form-data,并且将文件分段解析成单个的FileItem,方便对分段文件的操作。

FileItemFactory:将每一个单独的项目封装成DiskFileItem (FileItem接口的实现) 对象的任务,这是一个接口,在使用的时候需要使用具体的实现类,即DiskFileItemFactory。

实现文件上传的过程也非常简单,只需要:

1.下载并导入jar包

2.使用ServletFileUpload的isMultipartContent方法并传入请求对象的方式判断这个请求是否为文件上传的请求

3.创建工厂类对象,用于将每一个项目封装成单独的DiskFileItemFactory也就是FileItemFactory的具体实现类

4.创建文件上传的核心类,ServletFileUpload对象,将工厂类对象作为参数进行传递

5.通过核心类的parseRequest方法,传入一个请求对象为参数,获取到FileItem的集合,在真正进行文件的操作的时候,是使用FileItem对象进行操作

6.遍历FileItem集合,判断是普通的表单数据还是上传的文件,对于普通的表单数据,我们关注的是表单项的属性值和属性值对应的具体的值,对于上传的文件,我们关注的是属性值和文件名,并在获取到信息之后,将文件写入到输入,使用FileItem对象的write方法,参数为一个File对象,最好在构建File对象的时候将文件名添加进去

7.最后抛出异常,关闭流

上传文件使用到的方法和类:

方法 简单描述
ServletFileUpload isMultipartContext 判断这个请求是否为上传文件的请求,传入一个请求对象作为参数
parseRequest 将文件解析为单个的FileItem对象,传入一个请求对象
FileItem ifFormField 判断表单请求中是文件或普通的表单数据,如果是普通的表单数据返回true,如果是文件返回false
getFieldName 获取表单中的属性名
getName 获取文件名
getString 获取表单中的属性的值
write 将传入文件写入到磁盘
DiskFileItemFactory 工厂类的具体实现类,作为参数传递给上传文件的核心类

简单案例:将表单中传入的文件写入到E盘下的photo文件夹中

Servlet类中的内容:

package work;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.websocket.Session;
import javax.xml.ws.WebFault;
import javax.xml.ws.WebServiceClient;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Random;@WebServlet(name = "ServletEL" , value = "/ServletEL")
public class ServletEL extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}/*** 处理文件上传* @param req 请求对象* @param resp 响应对象* @throws ServletException Servlet异常* @throws IOException IO异常*/@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        System.out.println("文件上传成功!");
//        ServletInputStream inputStream = req.getInputStream();
//        byte[] bytes = new byte[1024];
//        int read = inputStream.read(bytes);
//        System.out.println(new String(bytes,0,read));/***文件上传的步骤:* 1.首先导入需要的jar包* 2.判断上传的文件是否为多段的,只有多段的文件才是上传的**/
//        判断是否为上传的数据if(ServletFileUpload.isMultipartContent(req)){
//            创建工厂实现类FileItemFactory fif = new DiskFileItemFactory();
//            创建用于解析上传数据的工具类ServletFileUpload sfu = new ServletFileUpload(fif);
//            解析数据,获取每一个分段数据的内容try {List<FileItem> items = sfu.parseRequest(req);for(FileItem f : items){if(f.isFormField()){System.out.println("获取的表单项的name值:"+f.getFieldName());
//                        参数UTF-8解决乱码问题System.out.println("获取的表单项的value值:"+f.getString("UTF-8"));
//                        System.out.println(f.getFieldName()+f.getString("UTF-8"));}else {System.out.println("表单项的name属性值:"+f.getFieldName());System.out.println("上传的文件名:"+f.getName());Random r = new Random();int i = r.nextInt(10);File file = new File("E:\\photo\\"+i+f.getName());if(file.exists()){file.delete();f.write(file);}else {f.write(file);}
//                        f.write(new File("E:\\photo\\"+i+f.getName()));}}} catch (Exception e) {throw new RuntimeException(e);}}}public static void main(String[] args) throws IOException {File f = new File("e:\\index.txt");if(f.exists()){System.out.println(f.delete());System.out.println(f.createNewFile());}else {System.out.println(f.createNewFile());}}
}

HTML提交文件页面中的内容:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--Created by IntelliJ IDEA.User: LenovoDate: 2022/10/31Time: 11:25To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>文件上传</title>
</head>
<body>
<form action="<c:url value="/ServletEL"/>" enctype="multipart/form-data" method="post"><table><tr><td>上传者:</td> <td><input type="text" name="username"></td></tr><tr><td>上传文件:</td> <td><input type="file" name="file"></td></tr><tr> <td><button type="submit">提交</button></td></tr></table>
</form>
</body>
</html>

注意点:

1.关于在部署工件时报错

如果你出现了以上的报错,说明你的lib文件没有完全的引入,你需要将你之前下载的两个jar包复制一份放在Tomcat的lib包下面

2.当你传入的文件路径不存在,即如果E盘下面不存在photo这个文件夹的时候并不会报错,而是自动创建一个photo的文件夹,并将文件写入进去,这跟File类的创建文件的参数有关

JavaWeb简单案例——文件的上传相关推荐

  1. FastDFS实现简单的文件的上传下载

    首先,我们先了解一些FastDFS的常用类和一些API 1.CLientGlobal:用于加载配置文件的公共客户端工具 方法: (1)init(String conf_filename):根据配置文件 ...

  2. 简单文件的上传与保存

    本文简单地使用Asp.net中FileUpload组件实现简单的文件的上传 页面前台部分 <asp:FileUpload ID="myFile" runat="se ...

  3. iOS 利用AFNetworking实现大文件分片上传

    概述 一说到文件上传,想必大家都并不陌生,更何况是利用AFNetworking(PS:后期统称AF)来做,那更是小菜一碟.比如开发中常见的场景:头像上传,九宫格图片上传...等等,这些场景无一不使用到 ...

  4. JavaWeb 文件的上传和下载

    JavaWeb 文件的上传和下载 这是一个简单的案例,让你快速了解JavaWeb中文件的上传和下载 文件的上传和下载是Web开发中非常常见和重要的功能,很多系统中都会经常使用文件的上传和下载. 如:博 ...

  5. Flume04:【案例】使用Flume采集文件内容上传至HDFS

    案例:采集文件内容上传至HDFS 接下来我们来看一个工作中的典型案例: 采集文件内容上传至HDFS 需求:采集目录中已有的文件内容,存储到HDFS 分析:source是要基于目录的,channel建议 ...

  6. 七牛云 vue 图片上传简单解说,js 上传文件图片

    七牛云 vue 图片上传简单解说,js 上传文件图片 一.七牛云简介 首次使用七牛云存储进行项目的图片存储,整了一上午才整明白,这些官方的教程把明白人也给说糊涂了,文档很不规范. 七牛云有免费的使用额 ...

  7. 手把手教你学javaweb(五)文件的上传和下载

    javaweb项目文件的上传和下载 ​ 在进行文件的上传和下载之前,我们先把javaweb项目做一点点的改动,那就是将LoginServlet的跳转由原来的forward方式改为 redirect方式 ...

  8. javaWeb - 文件的上传下载

    文件的上传和下载 <%--文件的上传和下载文件的上传和下载,是非常常见的功能.很多的系统中,或者软件中都经常使用文件的上传和下载.比如:QQ 头像,就使用了上传.邮箱中也有附件的上传和下载功能. ...

  9. 【JavaWeb】文件的上传和下载

    文章目录 一.文件的上传介绍⭐️ 1.文件上传及HTTP协议的说明 2.commons-fileupload.jar常用API介绍说明 二.文件下载⭐️ 一.文件的上传介绍⭐️ 1.文件上传及HTTP ...

最新文章

  1. 新浪api 40022错误
  2. ECSHOP商品编辑器上传中文名图片产生乱码
  3. 大佬的设计模式PDF学习笔记!
  4. 怎么让用一行代码实现页面的定时强制刷新?脚本刷流量再也不用愁了!
  5. 实现文件拖放的一种简洁方法
  6. 计算机上无线网络开关在哪里,笔记本电脑无线网开关在哪_笔记本电脑如何打开无线网-win7之家...
  7. SpringBoot法律知识分享问答论坛 lawbbs.liuyanzhao.com
  8. 网页转化成pdf,网页转换图片,wkhtmltopdf,wkhtmltoimage使用小结
  9. 谷歌浏览器http请求出现:Provisional headers are shown 提示
  10. 2018年1月西邻雪山自驾游攻略
  11. Linux磁盘术语描述
  12. 一次jdk1.7升级jdk1.8后导致redis运行时blocked_clients过多问题解决
  13. ZYNQ7000 学习(三十) 定时器终端的原理和实现
  14. git commit 提交出错,工作区代码被回退到最开始内容
  15. 前端实现登录拼图验证
  16. [Kali Linux]入门:内网穿透的教程和实战(很适合入门|附图)
  17. 逻辑运算符以及逻辑表达式
  18. 当 BBR 面对时延抖动
  19. PHP开发工程师岗位职责与任职要求
  20. 200行代码为大家解读这个Github冠军项目背后的定时器

热门文章

  1. O'Relly图书大合集
  2. td 内容自动换行 table表格td设置宽度后自动换行
  3. 笔记:PicoScope 3405D采集卡简单使用
  4. 15时49分:2018年天猫双11交易额破1682亿元 超2017年全天
  5. 【转载】Win10 LTSC 2019 Nvidia DCH 驱动安装 NVIDIA Control Panel
  6. VIPLE使用条件循环实现一个计数器
  7. 远程擦除数据是什么?
  8. 针对稳压二极管的特性,已知题 1 图所示电路中稳压管的稳定电压 6 UZ  V , 最小稳定电流 min 5 ZI  mA,问 UO1和 UO2各为多少伏?...
  9. html纯css类似qq登录的动态背景,QQ登录蓝色动态背景JS实现
  10. 【MacBook M1】 安装动手学深度学习d2l包+jupyter notebook运行