javaWeb之文件上传和下载

news2024/11/17 8:56:34

文件上传下载(场景):
 * 文件上传
   * 客户端
     * 文件上传页面(form)
       * 请求方式一定是POST.
       * 文件上传域(<input type='file'>)必须具有name属性.
       * 表单的enctype属性值设置为"multipart/form-data".

     * 扩展:浏览器内核产品不同(不建议使用IE)
       * IE浏览器:IE6.0\7.0    IE8.0\9.0    IE10\11
       * 其他浏览器:Webkit(苹果)
         * 苹果浏览器
     * 火狐浏览器:自主内核产品.
     * 谷歌浏览器:自主内核产品.
       * 众多国内浏览器:
         * 百度浏览器:号称自主内核.
     * 腾讯浏览器:号称自主内核.
     * 遨游浏览器:号称自主内核.
     * 360\搜狗\猎豹等...
   * 服务器端
     * 导入工具包:commons-fileupload.jar和commons-io.jar包.
     * 实现的步骤:
       * 实例化DiskFileItemFactory工厂类.
       * 实例化ServletFileUpload类.
         ServletFileUpload upload = new ServletFileUpload(factory);
       * 利用upload的parseRequest(request)方法从Request对象中获取文件上传的内容(List集合).
       * 遍历获取到的List集合.
         * 如果是普通项 - 获取普通项的文本内容.
       * isFormField():判断当前是否是普通项,true表示是.
       * getFieldName():获取普通项的name属性值.
       * getString():获取普通项的文本内容.
     * 如果是文件项
       * getName():获取上传文件的名称.
       * getInputStream():获取上传文件的输入流.
       * 通过保存的路径,创建文件的输出流.
       * 利用IOUtils.copy(inputStream,OutputStream)方法将上传文件进行保存.
     * 将文件上传至WEB-INF目录下:
       * WEN-INF目录外与WEB-INF目录中的区别:
         * WEN-INF目录外:在浏览器中可以访问的(安全低).
     * WEB-INF目录中:在浏览器中不能访问的.
     * 上传文件名称的处理:
       * 可能使用的浏览器版本过旧,获取到的文件上传的名称,而是选择上传文件的完整路径.
         C:\Users\JYL\Desktop\day0106\笔记\readme.txt
       * 解决办法:
         int index = fileName.lastIndexOf("\\");
     if(index >= 0){
         fileName.substring(index+1);
     }
     * 上传文件的中文乱码问题:
       * 普通项的中文乱码:
     * 利用FileItem的getString(encoding)方法来解决.
       fileItem.getString("utf-8");
       * 文件项的中文乱码:
         * POST方式的请求参数:
       request.setCharacterEncoding("utf-8")
     * 上传文件同名的问题:
       * 问题:默认情况下,上传多次同名的文件时,新的文件会覆盖旧的文件.
       * 解决:将每个上传的文件名,提供一个唯一的标识(拼在文件名中).
         fileName = UUID.randomUUID().toString()+fileName;
       * 注意:如果开发真实案例时,需要保存真实文件名称和上传后处理的文件名称.
     * 一个目录不能存放过多文件:
       * 问题:
         * 长时间使用后,上传目录的体积多大.
     * 上传目录保存的文件过多,查找文件过慢.
       * 解决:分级存储
         * 按照用户名称分级存储.
     * 按照日期时间分级存储.
     * 指定一个上传子目录最大存储空间.
     * 按照hashcode分级存储.
     * 处理文件上传大小的限制:
       * 单个文件大小的限制:3M
         * 利用ServletFileUpload的setFileSizeMax(字节数).
     * 问题:如果上传的单个文件大小,大于限制的大小时:抛异常.
       FileSizeLimitExceededException
       * 上传文件总大小的限制:10M
         * upload.setSizeMax(1024*1024*10);
     * 抛异常:SizeLimitExceededException
     * 上传文件的缓存文件大小与临时目录:
       * 默认情况下:上传文件的输入流存储在服务器端的内存中(缓存).
       * 问题:
         * 当上传的单个文件过大时,导致服务器端的内存空间不足(性能下降)
       * 解决:
         * 指定上传文件的缓存大小.
     * 如果上传文件的缓存大于指定的缓存(内存中)大小,使用临时文件(硬盘中)的方式.
       * 如何实现:
         * 指定上传的缓存大小:
       * factory.setSizeThreshold(1024*1024);
     * 设置上传临时目录:
       * factory.setRepository(new File(getServletContext().getRealPath("/tmp")));
       * 机制:当文件上传成功后,删除临时目录中的临时文件.
         fileItem.delete();
     * 上传文件比较大时,上传的速度变慢?
       * 原因就是输入流与输出流的问题.
         * 输出流:new BufferedOutputStream(new FileOutputStream(new File(realPath,fileName)));
     * 输入流:new BufferedInputStream(fileItem.getInputStream());
     * 文件上传的进度条的功能:
       * 服务器端:监听文件上传的整个过程(从开始上传到上传结束)
         * 需要文件上传的监听器.
            upload.setProgressListener(new ProgressListener() {
            /**
             * update(long pBytesRead, long pContentLength, int pItems)
             *  * 作用:用于监听文件上传过程的状态信息.
             *  * 参数pBytesRead:到目前为止,已经读取上传文件的大小.
             *  * 参数pContentLength:上传文件的总大小.
             *  * 参数pItems:当前上传文件,是表单的第几个元素.
             *  
             *  计算以下四个结果:
             *   * 已用时间:当前时间 - 开始时间
             *   * 上传速度:已经上传大小 / 已用时间
             *   * 剩余大小:总大小 – 已经上传大小
             *   * 剩余时间:剩余大小 / 速度
             */
            public void update(long pBytesRead, long pContentLength, int pItems) {
                // 获取文件上传的当前时间
                long currentTime = System.currentTimeMillis();
                // 已用时间:当前时间 - 开始时间
                long useTime = currentTime - startTime;
                // 上传速度:已经上传大小 / 已用时间
                long speed = pBytesRead / useTime;
                // 剩余大小:总大小 – 已经上传大小
                long restBytes = pContentLength - pBytesRead;
                // 剩余时间:剩余大小 / 速度
                long restTime = restBytes / speed;
                System.out.println("上传速度为: "+speed+" , "+"当前还有 "+restBytes+" 没有上传完成, "+"还有 "+restTime+" 上传完成");
            }
        });
       * 客户端:添加进度条的内容(异步交互技术Ajax)
 * 文件下载
   * 客户端
     * 显示文件下载列表(一):
       <h4><a href="${pageContext.request.contextPath }/downs/1.txt">1.txt</a></h4>
       <h4><a href="${pageContext.request.contextPath }/downs/2.xls">2.xls</a></h4>
       <h4><a href="${pageContext.request.contextPath }/downs/3.zip">3.zip</a></h4>
       <h4><a href="${pageContext.request.contextPath }/downs/4.jpg">4.jpg</a></h4>
       * 问题:
         * 如果浏览器本身支持下载文件的格式,并不提供下载,而是直接显示.
     * 如果浏览器本身不支持下载文件格式,提供下载功能.
     * 显示文件下载列表(二):
       <h4><a href="${pageContext.request.contextPath }/down?filename=1.txt">1.txt</a></h4>
       <h4><a href="${pageContext.request.contextPath }/downs?filename=2.xls">2.xls</a></h4>
       <h4><a href="${pageContext.request.contextPath }/downs?filename=3.zip">3.zip</a></h4>
       <h4><a href="${pageContext.request.contextPath }/downs?filename=4.jpg">4.jpg</a></h4>
   * 服务器端

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/757072.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

剖析C语言字符串函数(超全)

目录 前言&#xff1a; 一、strlen函数 功能&#xff1a; 参数和返回值&#xff1a; 注意事项&#xff1a; 返回值是无符号的易错点&#xff1a; strlen函数的模拟实现 1、计数器算法 2、递归算法 3、指针减去指针 二、strcpy函数 功能&#xff1a; 参数和返回值 …

git使用代码

git init //生成一个.git的子目录&#xff0c;产生一个仓库。 git status //查看当前目录下所有文件的状态。 git aad . //将该目录下所有的文件提交到暂存区 git add文件名/将该目录下指定的文件提交到暂存区 git commit -m v1.0//将暂存区的文件提交到版本库 git log //…

网络协议与攻击模拟-21-HTTP协议

HTTP 协议 1、 HTTP 协议结构 2、在 Windows server 去搭建 web 服务器 3、分析 HTTP 协议流量 一、 HTTP 协议 1、概念 HTTP &#xff08;超文本传输协议&#xff09;是用于在万维网服务器上传输超文本&#xff08; HTML &#xff09;到本地浏览器的传输协议 属于 TCP / …

树与图的(深度 + 广度)优先遍历

目录 一、树与图的存储1.树的特性2.图的分类3.有向图的储存结构 二、树与图的深度优先遍历的运用树的重心题意分析代码实现 三、树与图的广度优先遍历的运用图中点的层次题意分析代码实现 一、树与图的存储 1.树的特性 树是一种特殊的图,具有以下两个重要特性: 无环 树是一个…

Redis数据类型 — Set

目录 Set内部实现 源码片段 Set 类型是一个无序并唯一的键值集合&#xff0c;它的存储顺序不会按照插入的先后顺序进行存储。一个集合最多可以存储 2^32-1 个元素。 Set 类型除了支持集合内的增删改查&#xff0c;同时还支持多个集合取交集、并集、差集。Set 的差集、并集和…

Bean 的作用域和生命周期

目录 一、 Bean 的作用域 1. 安装Lombok插件 1.1 Lombok 简介 1.2 Lombok 安装 2. 创建一个 User 对象&#xff0c;然后将 User 对象 存储到 Spring 容器中 2.1 创建User 对象 2.2 将User 对象存储到 Spring 中 2.3 修改 User 对象中的属性&#xff0c;然后看结果&#…

概率论的学习和整理--番外12:2个概率选择比较的题目

目录 1 题目 2 结论 3 算法 3.1 错误算法 3.2 算法1&#xff0c;用期望的方式解方式 3.3 算法2&#xff0c;直接解方程 3.4 算法3&#xff0c;用递归--等比数列求和来算 4 上述比较的意义-回到问题本身 1 题目 题目 3个A合成1个B 方案1&#xff1a;1/4 几率返还一个A…

【ONE·Linux || 地址空间与进程控制(二)】

总言 进程地址空间和进程控制相关介绍。 文章目录 总言2、进程控制续2.3、进程等待2.3.1、为什么需要进程等待2.3.2、阻塞式等待2.3.2.1、使用wait2.3.2.2、使用waitpid2.3.2.3、参数status基本介绍 2.3.3、一些细节与问题</font>2.3.3.1、进程独立性说明2.3.3.1、父进程…

【网络安全带你练爬虫-100练】第13练:文件的创建、写入

目录 目标&#xff1a;将数据写入到文件中 网络安全O 目标&#xff1a;将数据写入到文件中 开干 &#xff08;始于颜值&#xff09;打开一个&#xff0c;没有就会创建 with open(data.csv, modew, newline) as file: &#xff08;忠于才华&#xff09;开始写入数据 writer cs…

LinuxC/C++开发工具——make/makefile和gdb

linux开发工具 前言Linux项目自动化构建工具&#xff08;make/makefile&#xff09;makefile文件的组成如何使用make.PHONY关键字 项目清理 gdb调试器背景使用list&#xff08;l&#xff09;调试命令break&#xff08;b&#xff09;&#xff1a;设置断点info break&#xff1a;…

[STL] vector 模拟实现详解

目录 一&#xff0c;准备工作 二&#xff0c;push_back 1&#xff0c; 关于引用 2. 参数const 的修饰 补充 三&#xff0c;迭代器实现 四&#xff0c;Pop_back 五&#xff0c;insert 1. 补充——迭代器失效 六&#xff0c; erase 七&#xff0c;构造函数 1. 迭代…

合并当天Log

1.原因&#xff0c; 我们程序运行Log很多时&#xff0c;如果因为要写Log话费很多时间&#xff0c;这时我们可以把log保存按照更短的时间保存&#xff0c;比如一分钟一个Log,一个小时一个log&#xff0c;。。。。但我们查看Log时很麻烦&#xff0c;需要把分散的Log合并起来的工…

移动端深度学习部署:TFlite

1.TFlite介绍 &#xff08;1&#xff09;TFlite概念 tflite是谷歌自己的一个轻量级推理库。主要用于移动端。 tflite使用的思路主要是从预训练的模型转换为tflite模型文件&#xff0c;拿到移动端部署。 tflite的源模型可以来自tensorflow的saved model或者frozen model,也可…

ylb-定时任务task

总览&#xff1a; 在api模块service包&#xff0c;创建IncomeService类&#xff1a;&#xff08;收益计划 和 收益返还&#xff09; package com.bjpowernode.api.service;public interface IncomeService {/*收益计划*/void generateIncomePlan();/*收益返还*/void generate…

基于mysql+java+springboot的福州大学生就业求职系统(含源码+系统演示视频)

1、系统演示视频&#xff1a;基于JavaMySQLspringboot的福州大学生就业求职系统演示视频 2、系统源码&#xff1a;系统源码链接 文章目录 一、需求分析1、公司招聘2、简历管理3、交流咨询 二、福州大学就业求职服务平台简介1.福州大学就业求职服务平台主要功能1.1.个人求职功能…

小黑子—JavaWeb:第一章 - JDBC

JavaWeb入门1.0 1. javaweb介绍2. 数据库设计2.1 约束2.2 表关系2.3 多表查询2.3.1 内连接&#xff08;连接查询&#xff09;2.3.2 外连接&#xff08;连接查询&#xff09;2.3.3 子查询 2.4 事务 3. JDBC3.1 JDBC 快速入门 4 JDBC API详解4.1 DriverManager4.2 Conncetion4.3 …

13_Linux无设备树Platform设备驱动

目录 Linux驱动的分离与分层 驱动的分隔与分离 驱动的分层 platform平台驱动模型简介 platform总线 platform驱动 platform设备 platform设备程序编写 platform驱动程序编写 测试APP编写 运行测试 Linux驱动的分离与分层 像I2C、SPI、LCD 等这些复杂外设的驱动就不…

吴恩达ML2022-用于手写数字识别的神经网络

1 用到的包 导入在这个分配过程中需要的所有包。 Numpy 是使用 Python 进行科学计算的基本软件包。Matplotlib 是在 Python 中绘制图形的流行库。tensorflow是一种流行的机器学习平台。 import numpy as np import tensorflow as tf from tensorflow.keras.models import Se…

Java对象导论

对象具有状态、行为和标识。每个对象都可以拥有内部数据&#xff08;它们给出了该对象的状态&#xff09;和方法&#xff08;它们产生的行为&#xff09;&#xff0c;并且每个对象在内存中都有一个唯一的地址&#xff08;标识&#xff09;。 抽象过程就是在问题空间元素和解空…