J2EE 文件上传下载

2023-05-16

  • Tomcat 9

文件上传

  • 文件上传本质上是 I/O 读写

    • 客户端(浏览器)发送文件使用 HTTP 协议,将文件的内容写出去:客户端本地输入流 > 内容 > 网络输出流
    • 服务器(Web容器)接收文件使用 HTTP 协议,将文件的内容读过来:网络输入流 > 内容 > 服务器本地输出流
  • 一般使用外部包进行文件上传,常用的是 apache 组织提供的两个包

    • commons-fileupload.jar
    • commons-io.jar

文件上传的步骤

知识补充:get 与 post 虽然对字节数都没有限制

  • 但 get 通过 URL 拼串,而不同浏览器对于 UR L处理长度有所不同
  • 但 post 需要 Web 容器的支持,与容器的处理性能有关,比如 Tomcat 默认无限制,但是可以通过修改 server.xml 配置文件中的 <Connector port="8080" maxPostSize="-1">

浏览器端

  1. JSP/HTML 文件中,表单通过 post 提交(不能使用 get,是由于 ServletFileUpload 类的规定)
  2. 表单中添加一个属性 enctype="multipart/form-date"
  3. 表单中使用 <input type="file"> 组件让用户选择上传的文件,不仅仅能得到文件名还可以将文件的内容读出来

服务器端

  1. 引入文件上传需要的jar包

    • commons-fileupload-1.4.jar
    • commons-io-2.7.jar
  2. 控制层

//1.创建一个工厂
DiskFileItemFactory factory = new DiskFileItemFactory();

//2.创建一个 ServletFileUpload 对象,包含一个 factory
ServletFileUpload upload = new ServletFileUpload(factory);

//3.使用 upload 对象解析 request,得到一个 List<FileItem>
List<FileItem> itemList = upload.parseRequest(request);
  1. 业务逻辑
  • 对普通组件与文件的处理方式
for (FileItem item: itemList) {
	if (item.isFormField()) { //是普通组件
		
		String key = item.getFieldName(); //获取组件的 name 属性		
		String value1 = item.getString(); //获取组件的 value 属性
		String value2 = item.getString("UTF-8"); //该重载方法可以处理字符集
		
	} else { //是文件
		
		String fileName = item.getName(); //获取上传文件的真实文件名
		InputStream inputStream = item.getInputStream(); //读取网络输入流
		item.write(new File("文件路径")); //写,即保存上传的文件
		
	}
}
  • 注意:如果上传的文件较大,为了防止丢包会产生临时文件(Tomcat 容器默认存在 temp 文件夹下)
factory.setSizeThreshold(10240); //设置缓冲区大小,默认10240byte - 10KB
factory.setRepository(new File("路径")); //设置缓冲区位置
  • 还可以设置上传文件的大小限制(为了缓解服务器存储压力)
upload.setFileSizeMax(); //单个上传文件的大小限制
upload.setSizeMax(); //上传文件总大小限制
  • 监控文件上传进度
upload.setProgressListener(new ProgressListener(){

	//文件上传字节数达到4096个字节,就触发一次监听器
	
	public void update(long l, long l1, int i) {
		//第一个参数表示 已经上传的字节个数  
		//第二个参数表示 上传文件的总字节数
		//第三个参数表示 正在上传第几个组件
		...
	}
});

文件上传注意事项

  1. 浏览器端需要满足四个条件:form表单、post请求、enctype属性、file组件(一个或多个)
  2. 服务器端需要满足:factory工厂对象、upload对象、解析request方法得到 List<FileItem>
  3. 上传文件保存的路径
    • 放在一个固定的位置,可移植性不好
    • 放在当前工程的根目录下 String path = this.getServletContext().getRealPath("/");
  4. 最好限制一下文件上传的大小:单个、总体、缓冲区
  5. 如果文件上传出现文件名冲突的问题
    • 方法一:原来名字+用户+时间.原来后缀
      beauty_zgh_date.jpg
    • 方法二:用一个随机产生的名字当做保存在服务器中的文件名
      beauty.jpg > xxxxx.jpg
      然后将 beatuy、xxxxx、路径、用户、上传时间 它们的关联存起来
    • 方法三:一个随机名字创建一个文件夹
      beauty.jpg 放在文件夹里
      然后将 路径、用户、文件夹名、上传时间 它们的关联存起来
  6. 有些时候可能上传的文件需要控制文件类型
    自己设计方法

文件下载

文件下载就很简单了

浏览器端

发送请求,一般通过 a 标签

服务器端

  1. 接收需要下载的文件名
  2. 找到文件并创建输入流读取内容
  3. 处理一下响应时的中文字符
  4. 设置响应内容类型和状态
  5. response 创建输出流将内容响应回浏览器

如果服务端存储的文件名字含有中文,需要处理一下

fileName = URLEncoder.encode(fileName,"UTF-8");

文件下载实质上就是服务器向浏览器返回文件信息,如果想看到浏览器跳出弹出框

response.setContentType("application/x-msdownload");
response.setHeader("Content-disposition", "attachment;filename=" + fileName); //fileName变量存储文件名
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

J2EE 文件上传下载 的相关文章

  • J2EE02 list(集合框架)

    目录 一 思维导图 编辑 二 list 集合的打印方式 三 list集合的特点 1 有序 2 元素可以重复 四 list的删除 五 list集合的 装箱 拆箱 一 思维导图 二 list 集合的打印方式 1 下标遍历for循环 2 fore
  • PDFBOX和ASPOSE.PDF

    一 aspose pdf 文档 https docs aspose com pdf java 1 按段落分段 docx文本按段分段 public static void main String args int i 1 try 打开文件流
  • 单元测试方法总结

    1 引言 应用系统的实施代码构建完成之后 并不代表项目已经结束 至少还有系统测试 部署以及性能调优等工作需要完成 测试的目的是检验开发结果是否满足规定需求 测试时保证软件质量的重要手段 是软件开发不可缺少的组成部分 虽然测试是一件乏味的工作
  • 验证框架的配置及validation.xml常用的验证规则(Struts2的输入验证详解)

    5 很多验证标签的type已经改了 对应的param里面的name属性也改了 针对最新版的struts 建议详细阅读struts的validation html 在docs docs下 比如regex对应的param的name 已经改为 r
  • idea右键建包无package(无class等之类的同样适用)

    Intelidea创建好项目之后 右键新建Java class的时候发现没有改选项 只有以下几个选项 把src目录设为源码目录 首先打开Project Structure 如果有test测试文件夹就选中然后点Test按钮 最后点击OK完成
  • GitHub、GIT、Intellij集成github初探

    一 什么是Git 刚接触Git或github的童鞋可能会把它们的概念搞混淆 所以在这里稍微解释一下 Git和github是两个完全不同的概念 Git是一个版本管理系统 Version Control System 简称 VCS 早期版本管理
  • Java文档注释用法+JavaDoc的使用详解

    Java文档注释 JavaDoc的使用详解 简介 文档注释负责描述类 接口 方法 构造器 成员属性 可以被JDK提供的工具 javadoc 所解析 自动生成一套以网页文件形式体现该程序说明文档的注释 注意 文档注释必须写在类 接口 方法 构
  • Java文档注释用法+JavaDoc的使用详解

    Java文档注释 JavaDoc的使用详解 简介 文档注释负责描述类 接口 方法 构造器 成员属性 可以被JDK提供的工具 javadoc 所解析 自动生成一套以网页文件形式体现该程序说明文档的注释 注意 文档注释必须写在类 接口 方法 构
  • sql语句练习50题(Mysql版)

    表名和字段 1 学生表 Student s id s name s birth s sex 学生编号 学生姓名 出生年月 学生性别 2 课程表 Course c id c name t id 课程编号 课程名称 教师编号 3 教师表 Tea
  • 在浏览器中播放m3u8

    我自己做了个简单的demo地址 https github com onyas vip url resolve 欢迎star或fork 在浏览器上播放m3u8的视频地址有两种方式 html的video标签的方式 这种方式播放很简单
  • 在windows上装oracle11g R2 小麻烦

    发现在windows上装11GR2这么麻烦的 因为下载有两个包 所以 必须要把stage里面的components中的内容copy在一起 或将下载下来的两个包解压到同一个目录下 否则会报错误找不到em ear等文件 大家小心了
  • S​alesforce是怎么完成从0到1的?

    我之前写过无数篇Salesforce的文章 但是很多人还是想看看Salesforce如何从0到1以及从1到10的发展 所以我找来Salesforce的创始人在2009年 Salesforce成立十周年 之际亲自写的一本书 云攻略 来给大家梳
  • 架构师进阶之路

    选择的范围太广 可以读的书太多 往往容易无所适从 我想就我自己读过的技术书籍中挑选出来一些 按照学习的先后顺序 推荐给大家 特别是那些想不断提高自己技术水平的Java程序员们 一 Java编程入门类 对于没有Java编程经验的程序员要入门
  • 判断点是否在任意多边形内(java)

    import java util ArrayList public class Test public static void main String args double px 113 0253 double py 23 98049 A
  • Web应用下实现定时任务简便方法

    在WEB应用下实现定时任务的简便方法 在web方式下 如果我们要实现定期执行某些任务的话 除了用quartz等第三方开源工具外 我们可以使用Timer和TimeTask来完成指定的定时任务 第一步 创建一个任务管理类 实现ServletCo
  • mybatis中批量插入的两种方式(高效插入)

    MyBatis简介 MyBatis是一个支持普通SQL查询 存储过程和高级映射的优秀持久层框架 MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装 MyBatis可以使用简单的XML或注解用于配置和原始映射 将
  • 压力测试工具apache-ab讲解

    最近在做webservices 得到的数据是从德国那边的服务器 要将这些数据整合到现在网站中去 不知道性能如何 就做个压力测试 现在有些压力测试工具都是收费的 在开源的apache中自带个ab工具 就在C Apache2 2 bin ab
  • 用java.util.Timer定时执行任务

    用java util Timer定时执行任务 如果要在程序中定时执行任务 可以使用java util Timer这个类实现 使用Timer类需要一个继承了java util TimerTask的类 TimerTask是一个虚类 需要实现它的
  • Netty 4.0 实现心跳检测和断线重连

    一 实现心跳检测 原理 当服务端每隔一段时间就会向客户端发送心跳包 客户端收到心跳包后同样也会回一个心跳包给服务端 一般情况下 客户端与服务端在指定时间内没有任何读写请求 就会认为连接是idle 空闲的 的 此时 客户端需要向服务端发送心跳
  • Apache POI组件操作Excel

    Apache的POI组件是Java操作Microsoft Office办公套件的强大API 其中对Word Excel和PowperPoint都有支持 当然使用较多的还是Excel 因为Word和PowerPoint用程序动态操作的应用较少

随机推荐

  • NXP SDK包导入到MCUxPress

    NXP SDK包导入https blog csdn net weixin 43086497 article details 117023228
  • git学习

    下面这个主要是介绍git的相关的指令 https blog csdn net sinat 20177327 article details 76062030 下面这个是git安装软件地址 添加链接描述
  • 关于IAR项目文件中*.icf的相关理解

    https www cnblogs com henjay724 p 8191908 html
  • 学习《apache源代码全景分析》之存储段和存储段组摘录

    1 当数据在过滤器中流动传递的时候 xff0c 数据是以存储段组的形式组织的 每一个存储段组包含多个存储段 xff0c 每一个存储段是一种数据类型的抽象 2 存储段组包含多个存储段 struct apr bucket APR RING EN
  • Pod提示NetworkPlugin cni failed to set up .. network:open/run/flannel/subnet.env:nosuchfileordirectory

    K8s在创建pod时发现pod状态为ContainerCreating状态 检查pod的日志发现提示 Failed create pod sandbox rpc error code 61 Unknown desc 61 failed to
  • 【slighttpd】基于lighttpd架构的Server项目实战(7)—http-parser

    转载地址 https blog csdn net jiange zh article details 50639178 对于http服务器 xff0c http request的解析是比较麻烦的 xff0c 由于我们的重点并不在这上面 xf
  • Java 单例模式

    文章目录 单例模式单例模式Singleton单例模式的代码单例模式代码的分析单例模式的实现 单例模式 单例模式Singleton 当一个类的方法要被大量用户同时调用时 一般用户都会先创建这个类的对象再通过对象调用类中的方法 但是对象是存放在
  • J2EE Servlet 管理机制

    Tomcat 9 Servlet 管理机制 xff08 1 xff09 Servlet 对象 xff0c 通过生命周期托管的方式实现单例设计模式 xff08 2 xff09 默认效果是延迟加载 以 Tomcat9 为例 xff0c 需要在
  • idea 与 Tomcat 有一个美妙的约定

    IntelliJ IDEA 2020 1 2Tomcat 9 0 37 文章目录 一 xff1a Web 容器二 xff1a 下载 TomcatTomcat 容器的文件夹结构 三 xff1a 将 Tomcat 和 IDEA 集成在一起四 x
  • Java 线程 基础知识总结

    线程基础 很不严谨的说 xff0c 线程是什么 xff1f 线程就是为了让很多个东西并发执行 xff0c 大大的提高程序执行的效率啊 三个非常重要的概念 xff1a 程序 xff1a 一组写好了的静态代码块 xff08 就我们写的那些代码玩
  • 模拟银行系统 Java 四份代码(三种交互方式,两种数据存储方式)

    环境 编程语言 xff1a Java 14 0 1IDE xff1a intelliJ IDEA 2020 1 2有 Java demo 涉及到使用 idea 编辑器创建文件 读取文件 xff1b 有关编码问题 xff0c 请参考下图 id
  • Java 模拟数据库连接池 + 模拟ORM框架

    环境 编程语言 xff1a Java 14 0 1数据库 xff1a MySQL 8 0 xff08 用户名与密码都是root xff0c ip及端口是localhost 3306 xff09 JDBC xff1a mysql connec
  • Java 模拟考试系统(Swing + IO)

    编程语言 xff1a Java 14 0 1IDE xff1a intelliJ IDEA 2020 1 2 使用了MVC分层架构思想 xff0c 并且仅涉及JavaSE内容 功能 xff1a 登录 43 考试UI xff1a Swing数
  • Java IO 基础知识总结

    观前提示 xff1a 本文涉及的代码演示部分 xff0c 为了文章的观赏性 xff0c 许多代码演示中有意忽略了导包 异常处理 所谓 IO xff0c I xff08 input xff09 O xff08 output xff09 xff
  • Java 模拟浏览器与服务器之间请求与响应的过程

    环境与MVC分层架构思想 编程语言 xff1a Java 14 0 1IDE xff1a intelliJ IDEA 2020 1 2 V View视图层String html jspC Controller控制层Servlet 控制的是相
  • helm部署相关服务过程中问题记录

    在学习helm部署相关服务过程中出现一些相关问题 xff0c 自己记录并供大家一起学习 xff01 xff01 xff01 问题1 部署helm 获取软件包失败 在通过wget https storage googleapis com ku
  • J2EE JSP 基础知识总结

    Tomcat 9Java Server Page xff08 Java 服务页 xff09 一 xff1a JSP 初识 使用 JSP 文件 JSP 是 HTML 文件与 Java 文件的混合文件 xff0c HTML 文件可以直接通过浏览
  • Java 模拟购物系统(Servlet + JSP + EL + JSTL)

    目的是将后端逻辑 流程 业务写清楚 xff0c 所以前端代码很简陋 xff08 丑 xff09 功能一 xff1a 登录 功能二 xff1a 注册 功能三 xff1a 欢迎界面 功能四 xff1a 商品分类界面 功能五 xff1a 购物界面
  • J2EE EL + JSTL 基础知识总结

    Tomcat 9EL Expression Language xff0c 表达式语言JSTL JSP Standard Tag Library xff0c JSP 标准标签库 JSP 代码并不好写 xff0c 因为包含前端代码与 Java
  • J2EE 文件上传下载

    Tomcat 9 文件上传 文件上传本质上是 I O 读写 客户端 xff08 浏览器 xff09 发送文件使用 HTTP 协议 xff0c 将文件的内容写出去 xff1a 客户端本地输入流 gt 内容 gt 网络输出流服务器 xff08