今天来讲javaweb的第10阶段学习。文件的上传与下载,今天主要说的是这个功能的实现,不用说了,听名字就是外行人也知道肯定很重要啦.

老规矩,首先先用一张思维导图来展现今天的博客内容。

ps:我的思维是用的xMind画的,如果你对我的思维导图感兴趣并且想看到你们跟详细的备注信息,请点击下载

另外:如果图看不清的话请右击---在新窗口中打开会清楚很多

一*, 文件的上传:

1 *分析实现步骤:

1.1* 客户端浏览器通过文件域选择本地要上传的文件.

* 点击"上传"按钮,将要上传的文件发送到服务器端.

* 服务器端接收客户端发送的上传文件.

* 定义一个保存上传文件的路径.

* 将上传的文件保存在该路径中.

* 将上传后的结果,响应给客户端浏览器.

2*客户端:

2.1* 编写界面:

* 定义一个用于向服务器端发送请求的表单.

* 表单内具有文件域用于选择本地要上传的文件.

* 表单内具有submit按钮用于提交请求的.

2.2* 问题:

问:提交表单时,只是将文件域选择的文件名称上传.(并不是将上传文件提交),怎么解决?

答: 为表单设置enctype="multipart/form-data"

2.3* 注意:

A* 文件域必须指定name属性值,否则需要上传的文件数据是不会上传至服务器端.

B* 完成文件上传功能的表单的请求类型必须是POST方式.

C* 完成文件上传功能的表单的enctype属性值设置为"multipart/form-data",

该值的作用是将需要上传的文件数据添加到Http请求体中,并使用MIME协议对上传的文件进行描述.

3 *服务器端:

3.1 * 使用第三方工具:fileupload

* 使用fileupload组件,导入jar包:

* commons-fileupload-1.3.1.jar

* commons-io-2.2.jar

3.2* 功能实现:

3.21*将上传文件保存的目录放置在Web应用程序的根目录下.(不安全)

A* 问题描述:

* 将上传文件保存后,可以通过浏览器访问到的.

* 举例:如果上传的文件是一个JSP页面,包含Java代码(实现10秒自动关机).

B* 解决方案:

* 将保存上传文件的目录,设置在一个不能通过浏览器访问的位置.

* 将保存上传文件的目录,放置在"WEB-INF"目录下即可.

3.22*处理上传的文件名称:

A* 问题描述:

* 有些浏览器(IE 6),上传的文件名称并不是单纯的文件名,而是该文件的真实路径.

B* 解决方案:

* 判断当前获取的文件名称是真实文件名,还是上传文件的真实路径.

* 如果是真实路径,将文件名之前的所有路径去掉.

3.23*处理上传文件的中文乱码问题:

A * 问题描述:

* 上传文件的名称存在中文乱码问题.

* 上传表单中的普通字段值存在中文乱码问题.

B * 解决方案:

* 上传文件名称:

* request.setCharacterEncoding("utf-8");

* ServletFileUpload.setHeaderEncdoing("UTF-8");

* 普通字段值:

* FileItem.getString(编码格式) -编码格式:表示当前文本内容为什么编码.

3.24*上传文件名称同名问题:

A * 问题描述:

* 前后分别上传两个同名的文件,但内容不同.

* 后上传的文件会覆盖前上传的文件.

B* 解决方案:

* 生成唯一ID:UUID.randomUUID().toString()+"_"+fileName;

3.25*一个目录不能存放多个文件:

A* 问题描述:

* 如果一个目录中存在上传文件过多时,读取不方便.

B* 解决方案:

* 分成多个目录存储上传文件:

①* 按照日期分目录:2015-03-31、2015-04-01等

②* 按照MIME类型分目录:文本格式、图片、视频等

* 按照用户ID分目录:user1、user2等

④*使用UUID生成随机数的hashcode生成多级目录:

3.26*限制上传大小

* 限制单个文件上传大小:upload.setFileSizeMax(1024*1024*3);

* 限制上传文件的总大小:upload.setSizeMax(1024*1024*10);

3.27*文件缓存大小与临时目录

A* 设置临时目录

* 默认的临时目录为System.getProperty("java.io.tmpdir").

* DiskFileItemFactory.setRepository(new File(getServletContext().getRealPath(临时目录相对路径)));

* 在文件上传完成后,调用FileItem的Delete()方法,删除临时目录中的临时文件.(释放资源)

B* 设置缓存大小

* 如果不手动设置缓存大小,默认为10KB.

* DiskFileItemFactory.setSizeThreshold(缓存字节数);

* 手动将缓存大小设置10M,表示什么意思?

* 如果上传文件小于10M的话,存在服务器端的内容中.

* 如果上传文件大于10M的话,存在服务器端的临时目录中.

* 注意:如果设置缓存大小过大,影响服务器端的性能.

3.28*计算文件上传进度控制:

A* 计算上传进度的相关信息:

* 已用时间:当前时间 – 开始时间

* 速度:已经上传大小/已用时间

* 剩余大小:总大小 – 已经上传大小

* 剩余时间:剩余大小/速度

B* 如何实现监视上传进度:

* 使用ServletFileUpload提供的setProgressListener()方法实现.

3.29 *实现多文件上传页面:

A* 一个表单包含多个文件域.

同时选择多个需要上传的文件,一起提交上传.(问题:要么一起成功,要么一起失败)

B* 一个文件域一个上传,多个上传文件之间是独立的.(Ajax技术:异步交互)

二* 文件的下载:

1*如何使用文件下载:

1.1* 创建一个文件下载页面

当用户点击下载时,将请求提交服务器端的Servlet进行处理.

1.2*服务器端的Servlet实现的步骤:

* 获取客户端提交的下载文件名称.

* 获取对应存储下载文件的目录结构.

* 通过输入流读取对应下载文件内容.

* 获取Response对象的OutputStream输出流.

* 将读取的输入流,输出到Response对象的输出流,响应到客户端浏览器下载即可.

2*问题:

2.1* 设置当前下载文件的MIME类型.

response.setContentType(getServletContext().getMimeType(filename));

2.2* 设置通知浏览器当前下载文件必须提供下载选项

response.setHeader("Content-Disposition", "attachment;filename="+filename);

2.3* 下载中文乱码问题:

A*解决GET方式请求下载文件名的中文乱码:

new String(filename.getBytes("ISO-8859-1"),"utf-8");

B*下载对应文件时,下载文件名称中文乱码:

java web 文件上传_Javaweb学习笔记10—文件上传与下载相关推荐

  1. java web开发周志_javaweb学习笔记及周报告

    第三周: 1.html(HyperText Markup Language:超文本标记语言 ):网页语言. (1)解释名词 a.超文本:超出文本的范畴,使用html可以轻松实现类似使文字带颜色的操作: ...

  2. java ee 上传文件_17.《JavaEE 学习笔记》Servlet 上传文件

    功能介绍: 利用 Servlet 和表单提交,选择本地文件上传到服务器.上传的文件可以是文本文件或图像文件或任何文档,不能是文件夹. 需要引入的 jar 文件:commons-fileupload-1 ...

  3. Python+Selenium学习笔记10 - send_keys上传文件

    在火狐浏览器上传文件 上传前,同一个HTML文件在火狐和Edge浏览器显示有些不同 这是Firefox浏览器的显示 这是Edge浏览器 上传后 1 # coding = utf-8 2 3 from ...

  4. python读取文件路径格式_Python学习笔记读写文件之文件与文件路径

    随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...

  5. python网络编程web教程_python网络编程学习笔记(10):webpy框架

    django和webpy都是python的web开发框架.Django的主要目的是简便.快速的开发数据库驱动的网站.它强调代码复用,多个组件可以很方便的以"插件"形式服务于整个框架 ...

  6. Web前端开发之CSS学习笔记10—栅格布局(网格布局)

    目录 [网格布局grid] 1.网格布局的构成 2.父容器grid container 3.生成网格容器 display:grid/inline-grid 4.构建网格 grid-template-c ...

  7. nc65命令执行漏洞上传webshell学习笔记

    nc65命令执行漏洞上传webshell学习笔记 免责声明: 此文为本人学习笔记,不承担任何法律责任. 访问者在从事与本站相关的所有⾏为(包括但不限于访问浏览.利⽤.转载.宣传介绍)时,必须以善意且谨 ...

  8. SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传

    SpringMVC:学习笔记(10)--整合Ckeditor且实现图片上传 配置CKEDITOR 精简文件 解压之后可以看到ckeditor/lang下面有很多语言的js,如果不需要那么多种语言的,可 ...

  9. MUI学习笔记之图片上传和预览

    MUI学习笔记之图片上传和预览 源代码是从博客园下载 我一边学习,一边注释,力求理解 <head> <meta charset="UTF-8"> <m ...

最新文章

  1. 第十七届全国大学生智能车竞赛智能视觉组培训第一弹
  2. SAPScript和Smartform双面打印
  3. mysql 中文 问号 utf8_[MySql] 设置了UTF8,中文存数据库中仍然出现问号
  4. 微信(QQ)截图时,无法保留鼠标右键菜单选项内容
  5. jQuery 鼠标滚轮插件应用 mousewheel
  6. vue框架可以配合php做企业站,基于Vue和PHP打造前后端分离的通用管理系统(一)...
  7. Tensorflow 迁移学习 识别中国军网、中国军视网Logo水印
  8. NanoLog软件架构
  9. Django3与Vue3前后端分离搭建
  10. np.where与np.argwhere共同点与区别分析
  11. chap1统计学习及监督学习
  12. java+sql+用户登录失败,java.sql.SQLException:用户'sa'登录失败
  13. 公司网络上网慢排查项
  14. 读《创业36条军规》(三)学先进 傍大款 走正道
  15. jstl和el表达式
  16. 学术Assignment写作怎么了解文献内容?
  17. Verilog语言、语法
  18. 秦储一行拜访陕西省文联和陕西新华出版传媒集团
  19. ORACLE导入unl
  20. 两种构造最小生成树的算法(普里姆算法,克鲁斯卡尔算法)

热门文章

  1. matplotlib 绘图
  2. 46.逻辑卷管理1,lvm架构,概念,常用命令介绍
  3. JAVA文件上传 ServletFileUpLoad 实例
  4. c语言怎么弄小数点,数码管小数点
  5. c语言中assert函数,assert()函数用法总结
  6. ufs2.0测试软件,三星S8被爆混用UFS闪存 如何测试是UFS 2.0还是UFS 2.1?
  7. 15个小时做10个可视化大屏,科技感爆棚,我把方法和工具教你
  8. oracle的substr函数用法,Oracle的substr函数简单用法详解
  9. 文件传输请求最快的方式_实施块请求并更快地上传大文件30
  10. 分布式秒杀实战之订单数据分表