学习文件上传和下载

文件上传下载

文件上传

文件上传的应用

比如个人信息的管理,上传头像

比如商品信息的管理,上传商品的图片

这些都需要通过浏览器客户端将图片上传到服务器的磁盘上

文件上传原理

所谓的文件上传就是服务器端通过request对象获取输入流,将浏览器端上传的数据读取出来,保存到服务器端

客户端浏览器注意事项

1.请求方式必须是 post

2.需要使用组件<input type="file" name="file">

3.表单必须设置enctype="multipart/form-data"

服务器端处理

通过request对象,获取InputStream, 可以将浏览器提交的所有数据读取到.

上传开源框架-commons-upload

Apache 开源组织提供了一个用来处理表单文件上传的一个开源组件( Commons-fileupload ),该组件性能优异,并且其API使用极其简单,可以让开发人员轻松实现web文件上传功能,因此在web开发中实现文件上传功能,通常使用Commons-fileupload组件实现。


使用Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑jar包:Commons-fileupload和commons-io,

commons-io 不属于文件上传组件的开发jar文件,但Commons-fileupload 组件从1.1 版本开始,它工作时需要commons-io包的支持

文件上传案例

在浏览器端创建一个可以上传文件的表单,在服务器端通过commons-fileupload完成文件上传。

浏览器端注意三件事情:

        1.表单的method=post

        2.设置enctype=multipart/form-date

        3.使用具有name属性的file元素

在服务器端

        1.创建DiskFileItemFactory

        2.创建ServletFileUpload

        3.通过ServletFileUpload的parseRequest方法得到所有的FileItem

1.设置浏览器端

<form action="Upload" method="post" enctype="multipart/form-data">

       <input type="file" name="photo"/>

       <input type="submit" value="上传"/>

</form>

2.在服务器端操作                         

关键类:

DiskFileItemFactory:ServletFileUpload工厂类

ServletFileUpload:用于处理文件上传的类

IOUtils:文件上传IO流类

BeanUtils:存储表单内文本信息类

//设置乱码

upload.setHeaderEncoding("UTF-8");

完善细节

  1. 设置保存上传文件的服务器目录
  1. 解决上传文件名是中文的问题,通过item.getName()获取到文件的名称
    1. 直接将其改名,不用原来的名字
    2. 保存其中文的名字(注意,一般如果是压缩文件供下载的资源,则可以考虑保留其中文名称,否则一般图片直接展示用的,不建议用中文名来保存)

思考题:文件名重复了怎么办?

问题:覆盖

解决方案:

客户端参与

1,方案一:做个文件名的唯一性校验,告诉客户端,这个文件名已经存在(不建议)

服务端解决

1,方案二:重新取个名字(唯一性:时间、UUID)---图片资源

利用时间保证唯一性:System.currentTimeMillis()

利用UUID保证唯一性:

2,方案三:下载电影压缩包,水野朝阳.zip 保留原有的名字

2016\10\18\103819\3天精通Java

获取完整的表单数据

保存一个完整的表单信息,除了将文件上传到服务器以外,还需要将其他表单项信息保存到对象,并存储到数据中心,而对应的图片信息则保存为保存的路径即可。

那么怎么获取到其他的表单项数据?item.getFileName(),item.getString()

为了更好完成对其他表单项的值的获取,需要借助另一个开源框架 BeanUtils

它除了自身的jar包,还依赖于commons-logging.jar

细节:

有复选框的情况怎么办?

多文件上传案例

实现多文件的批量上传

Ps:展示图片-"upload" + File.separator + datePath + File.separator + filename);

文件下载

主要实现方式有两种

  1. 超链接下载
  2. 以超练级的方式下载压缩文件
  3. 以超链接的方式下载图片文件
  4. 以超链接的方式下载中文文件名的文件
  5. Servlet下载

有些超链接搞不定的事情就交给Servlet来搞定

采用流的方式来读和写

设置响应的头部信息(告诉客户端是以附件的形式下载)

response.setHeader("Content-disposition", "attachment;fileName="+fileName);

细节:

下载的文件名是中文怎么办?

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

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

相关文章

当 DolphinDB 遇上方程式赛车:捕捉极速赛场上的时间印记

在风驰电掣的赛车场上&#xff0c;每一毫秒都蕴藏着无限的可能。在这里&#xff0c;数据不再是冰冷的数字序列&#xff0c;而是跳动的脉搏&#xff0c;每一次跃动都精准地回应着赛车的每一次呼吸&#xff0c;敏锐感知着赛车的动态。随着物联网和遥测技术的发展&#xff0c;实时…

六西格玛培训新选择,老字号品质有保障!

在追求企业卓越与完美的道路上&#xff0c;六西格玛管理无疑是一个被广泛认可与采纳的方法论。六西格玛不仅仅是一种管理策略&#xff0c;更是一种文化和哲学&#xff0c;它强调通过数据驱动和持续改进来减少流程中的缺陷&#xff0c;提升客户满意度&#xff0c;并最终实现企业…

【ARM Coresight Debug 系列 -- ARMv8/v9 软件实现断点地址设置】

请阅读【嵌入式开发学习必备专栏 】 文章目录 ARMv8/v9 软件设置断点地址断点地址软件配置流程代码实现 ARMv8/v9 软件设置断点地址 在ARMv8/9架构中&#xff0c;可以通过寄存器 DBGBVR0_EL1 设置断点。这个寄存器是一系列调试断点值寄存器中的第一个DBGBVRn_EL1&#xff0c;其…

jpg图片怎么压缩大小?图片压缩,3个方法

在日常生活中&#xff0c;我们经常会面临着需要在网络上传送、分享或存储的图片文件过大的问题&#xff0c;而JPG格式的图片由于其普遍性&#xff0c;也常常成为我们处理的对象。为了解决这一常见的挑战&#xff0c;学会如何压缩JPG图片的大小是非常实用的技能。 在这篇文章中…

水文地质勘探乙级资质的升级策略

1. 技术力量增强 引进高端人才&#xff1a;积极招募具有高级职称或相关专业领域内有影响力的专家&#xff0c;提升团队整体技术水平。专业培训提升&#xff1a;定期组织员工参加国内外专业培训、研讨会&#xff0c;加强理论知识和实践技能的更新。技术研发与创新&#xff1a;加…

渗透测试基础(二)

1. Linux常用命令 1.1 解压缩相关 2. Win下常用Dos命令 2.1 打开Dos命令行 WinR 输入cmd&#xff0c;按下回车。

「51媒体」电视台媒体邀约采访报道怎么做?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 电视台作为地方主流媒体&#xff0c;对于新闻报道有着严格的选题标准和报道流程。如果您希望电视台对某个会议或活动进行报道&#xff0c;可以按这样的方法来做&#xff1a; 1.明确活动信…

鼠情自动监测系统

TH-SH1在农业生产中&#xff0c;鼠害问题一直是困扰农民的一大难题。传统的鼠害防治方法往往依赖于大规模施药或布置捕鼠器等方式&#xff0c;这些方法不仅效率低下&#xff0c;而且容易对环境造成污染。随着科技的不断发展&#xff0c;鼠情自动监测系统应运而生&#xff0c;为…

valueOf()方法总结

valueOf()方法总结 大家好&#xff0c;在下是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的程序员&#xff0c;也是穿着拖鞋写代码&#xff0c;穿着拖鞋调BUG的拖鞋王&#xff01; 什么是valueOf()方法&#xff1f; 在Java中&#xff0c;valueOf()方法是一个静态工…

LabVIEW Windows与RT系统的比较与选择

LabVIEW是一种系统设计和开发环境&#xff0c;广泛应用于各类工程和科学应用中。LabVIEW Windows和LabVIEW RT&#xff08;Real-Time&#xff09;是LabVIEW的两个主要版本&#xff0c;分别适用于不同的应用场景。以下从多个角度详细分析两者的区别&#xff0c;并提供选择建议。…

云计算 | (七)特殊云机制

文章目录 📚自动伸缩监听器📚负载均衡器📚SLA监控器📚按使用付费监控器📚审计监控器📚故障转移系统📚虚拟机监控器📚资源集群📚多设备代理📚状态管理数据库📚自动伸缩监听器 自动伸缩监听器 (Automated scaling listener)是一个服务代理,它监控和追踪…

JavaFX 下拉框

组合框允许用户选择几个选项之一。用户可以滚动到下拉列表。组合框可以是可编辑和不可编辑的。 创建组合框 以下代码将选项列表包装到ObservableList中&#xff0c;然后使用observable列表实例化ComboBox类。 ObservableList<String> options FXCollections.observab…

leetcode139-Word Break

题目 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: s “leetcode”, wor…

机器学习课程复习——朴素贝叶斯

1. 定义 是一种基于贝叶斯定理与特征条件独立假设的生成式分类方法。 2. 公式 原版公式 简化版公式 由于上述公式无法计算&#xff0c;引入条件独立假设 条件独立版公式 3. 贝叶斯分类器 由上述公式可得贝叶斯分类器 化简为 4. 参数估计 4.1. 极大似然估计 4.2. 学习与分…

【规格说明】软件需求规格说明书实际项目案例模板(doc原件套用)

1 范围 1.1 系统概述 1.2 文档概述 1.3 术语及缩略语 2 引用文档 3 需求 3.1 要求的状态和方式 3.2 系统能力需求 3.3 系统外部接口需求 3.3.1 管理接口 3.3.2 业务接口 3.4 系统内部接口需求 3.5 系统内部数据需求 3.6 适应性需求 3.7 安全性需求 3.8 保密性需求 3.9 环境需求…

008、Scikit-learn基础教程

目录 1. 获取并准备数据 2. 训练测试数据划分 3. 训练机器学习模型 4. 模型评估 5. 保存和加载模型 6. 数据预处理 7. 特征缩放 8. 模型选择和验证 9. 管道(Pipeline)和特征工程 10. 有监督学习算法 11. 无监督学习算法 聚类算法 降维算法 异常检测 12. 模型解释…

JS-13.es6-class

目录 1 定义一个类 2 添加实例方法 3 添加静态方法 4 类的继承 1 定义一个类 class Person {constructor(name) {this.namename;}} 相当于 function Person(name){this.namename;} 2 添加实例方法 class Person {constructor(name,age) {this.namename;this.ageage;}//定…

架构设计 - Nginx Proxy Cache 缓存配置

摘要&#xff1a; web 应用业务缓存通常3级&#xff1a; 一级缓存&#xff1a;JVM 本地缓存 二级缓存&#xff1a;Redis集中式缓存 三级缓存&#xff1a;Nginx Proxy Cache 缓存 或 Nginx Lua 缓存 本文主要分享 Nginx Proxy Cache 缓存 缓存方式举例 配置 nginx.conf 文件…

【Nginx系列】反向代理在现代网络架构中的重要性

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【pytest】parametrize获取参数的几种常用形式

一、直接在标签上传参&#xff1a; 一个参数多个值 pytest.mark.parametrize("参数", (参数值1, 参数值2, 参数值3)) 示例&#xff1a; import pytest # 单个参数的情况 pytest.mark.parametrize("a", (1, 2, 3, 4)) def test_add(a):print("\na…