JavaWeb简单案例——文件的上传
简单介绍:
首先获取文件上传需要的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简单案例——文件的上传相关推荐
- FastDFS实现简单的文件的上传下载
首先,我们先了解一些FastDFS的常用类和一些API 1.CLientGlobal:用于加载配置文件的公共客户端工具 方法: (1)init(String conf_filename):根据配置文件 ...
- 简单文件的上传与保存
本文简单地使用Asp.net中FileUpload组件实现简单的文件的上传 页面前台部分 <asp:FileUpload ID="myFile" runat="se ...
- iOS 利用AFNetworking实现大文件分片上传
概述 一说到文件上传,想必大家都并不陌生,更何况是利用AFNetworking(PS:后期统称AF)来做,那更是小菜一碟.比如开发中常见的场景:头像上传,九宫格图片上传...等等,这些场景无一不使用到 ...
- JavaWeb 文件的上传和下载
JavaWeb 文件的上传和下载 这是一个简单的案例,让你快速了解JavaWeb中文件的上传和下载 文件的上传和下载是Web开发中非常常见和重要的功能,很多系统中都会经常使用文件的上传和下载. 如:博 ...
- Flume04:【案例】使用Flume采集文件内容上传至HDFS
案例:采集文件内容上传至HDFS 接下来我们来看一个工作中的典型案例: 采集文件内容上传至HDFS 需求:采集目录中已有的文件内容,存储到HDFS 分析:source是要基于目录的,channel建议 ...
- 七牛云 vue 图片上传简单解说,js 上传文件图片
七牛云 vue 图片上传简单解说,js 上传文件图片 一.七牛云简介 首次使用七牛云存储进行项目的图片存储,整了一上午才整明白,这些官方的教程把明白人也给说糊涂了,文档很不规范. 七牛云有免费的使用额 ...
- 手把手教你学javaweb(五)文件的上传和下载
javaweb项目文件的上传和下载 在进行文件的上传和下载之前,我们先把javaweb项目做一点点的改动,那就是将LoginServlet的跳转由原来的forward方式改为 redirect方式 ...
- javaWeb - 文件的上传下载
文件的上传和下载 <%--文件的上传和下载文件的上传和下载,是非常常见的功能.很多的系统中,或者软件中都经常使用文件的上传和下载.比如:QQ 头像,就使用了上传.邮箱中也有附件的上传和下载功能. ...
- 【JavaWeb】文件的上传和下载
文章目录 一.文件的上传介绍⭐️ 1.文件上传及HTTP协议的说明 2.commons-fileupload.jar常用API介绍说明 二.文件下载⭐️ 一.文件的上传介绍⭐️ 1.文件上传及HTTP ...
最新文章
- 新浪api 40022错误
- ECSHOP商品编辑器上传中文名图片产生乱码
- 大佬的设计模式PDF学习笔记!
- 怎么让用一行代码实现页面的定时强制刷新?脚本刷流量再也不用愁了!
- 实现文件拖放的一种简洁方法
- 计算机上无线网络开关在哪里,笔记本电脑无线网开关在哪_笔记本电脑如何打开无线网-win7之家...
- SpringBoot法律知识分享问答论坛 lawbbs.liuyanzhao.com
- 网页转化成pdf,网页转换图片,wkhtmltopdf,wkhtmltoimage使用小结
- 谷歌浏览器http请求出现:Provisional headers are shown 提示
- 2018年1月西邻雪山自驾游攻略
- Linux磁盘术语描述
- 一次jdk1.7升级jdk1.8后导致redis运行时blocked_clients过多问题解决
- ZYNQ7000 学习(三十) 定时器终端的原理和实现
- git commit 提交出错,工作区代码被回退到最开始内容
- 前端实现登录拼图验证
- [Kali Linux]入门:内网穿透的教程和实战(很适合入门|附图)
- 逻辑运算符以及逻辑表达式
- 当 BBR 面对时延抖动
- PHP开发工程师岗位职责与任职要求
- 200行代码为大家解读这个Github冠军项目背后的定时器
热门文章
- O'Relly图书大合集
- td 内容自动换行 table表格td设置宽度后自动换行
- 笔记:PicoScope 3405D采集卡简单使用
- 15时49分:2018年天猫双11交易额破1682亿元 超2017年全天
- 【转载】Win10 LTSC 2019 Nvidia DCH 驱动安装 NVIDIA Control Panel
- VIPLE使用条件循环实现一个计数器
- 远程擦除数据是什么?
- 针对稳压二极管的特性,已知题 1 图所示电路中稳压管的稳定电压 6 UZ V , 最小稳定电流 min 5 ZI mA,问 UO1和 UO2各为多少伏?...
- html纯css类似qq登录的动态背景,QQ登录蓝色动态背景JS实现
- 【MacBook M1】 安装动手学深度学习d2l包+jupyter notebook运行