今天来讲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* 下载对应文件时,下载文件名称中文乱码:

 

 

 

 

 

Javaweb学习笔记10—文件上传与下载的更多相关文章

  1. JavaWeb学习总结,文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  2. SpringMVC:学习笔记(8)——文件上传

    SpringMVC--文件上传 说明: 文件上传的途径 文件上传主要有两种方式: 1.使用Apache Commons FileUpload元件. 2.利用Servlet3.0及其更高版本的内置支持. ...

  3. Django:学习笔记(8)——文件上传

    Django:学习笔记(8)——文件上传 文件上传前端处理 本模块使用到的前端Ajax库为Axio,其地址为GitHub官网. 关于文件上传 上传文件就是把客户端的文件发送给服务器端. 在常见情况(不 ...

  4. Java精选笔记_文件上传与下载

    文件上传与下载 如何实现文件上传 在Web应用中,由于大多数文件的上传都是通过表单的形式提交给服务器的,因此,要想在程序中实现文件上传的功能,首先得创建一个用于提交上传文件的表单页面. 为了使Serv ...

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

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

  6. springmvc学习笔记--支持文件上传和阿里云OSS API简介

    前言: Web开发中图片上传的功能很常见, 本篇博客来讲述下springmvc如何实现图片上传的功能. 主要讲述依赖包引入, 配置项, 本地存储和云存储方案(阿里云的OSS服务). 铺垫: 文件上传是 ...

  7. Struts2学习笔记(十一)——文件上传

    1.单文件上传 单文件上传步骤: 1)创建上传jsp页面 文件上传的表单提交方式必须是POST方式,编码类型:enctype="multipart/form-data",默认是 a ...

  8. go web 第二天 学习笔记之文件上传

    package main import ( "crypto/md5" "fmt" "html/template" "io" ...

  9. SpringMVC学习笔记八:文件上传及多个文件上传

    SpringMVC实现文件上传需要加入jar包,commons-fileupload-1.3.1.jar,commons-io-2.2.jar 项目目录树: pom.xml加入需要的包 <pro ...

随机推荐

  1. 2014山东省“浪潮杯”第五届ACM省赛总结

    一次比赛做一次总结,弱菜又来总结了…… 我这种大四的又死皮赖来混省赛了,貌似就我和山大威海的某哥们(不详其大名)了吧.颁奖前和他聊天,得知他去百度了,真是不错,ORZ之. 比赛流水账: 题目目前不知道 ...

  2. hdu2552

    点击打开链接 思路: 1.tan(a+b) = ( tan(a) + tan(b) ) / (1 – tan(a) * tan(b) ) 2.tan( atan(x) ) = x arctan(1/s ...

  3. 通过HttpservletRequest对象获取客户端的真实IP地址

    这篇文章主要介绍了Java中使用HttpRequest获取用户真实IP地址,使用本文方法可以避免Apache.Squid.nginx等反向代理软件导致的非真实IP地址,需要的朋友可以参考下 在JSP里 ...

  4. bzoj3270博物馆——期望概率DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3270 设计一个状态表示两个人分别在两个点的状态,带个标号num[i][j]: 据此得到状态之 ...

  5. HBase之一:HBase原理和设计

    一.简介 HBase —— Hadoop Database的简称,Google BigTable的另一种开源实现方式,从问世之初,就为了解决用大量廉价的机器高速存取海量数据.实现数据分布式存储提供可靠 ...

  6. 1. jsp中<base target='' />标签用法

    用于页面跳转后,页面最后跳转到哪个iframe.例子如下: index.jsp :首页 <head> <base href="<%=basePath %>&qu ...

  7. django url 规则正确,却一直匹配错误,django url匹配错误的可能原因

    首先看一下我想要匹配的规则如下 这个url之前设计的是 joke/index/ 后来需要加page参数就把'/'去掉了 然后再用 joke/index去访问页面时总显示 当我把鼠标放到对应连接时,显示 ...

  8. Cg(c for graphic)语言的数据类(转)

    抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人” 本章将着重介绍Cg语言中预定义的内置(bu ...

  9. 洛谷 P4125 [WC2012]记忆中的水杉树【扫描线+set+线段树】

    我没有找到能在bzojAC的代码--当然我也WA了--但是我在洛谷过了,那就假装过了吧 minmax线段树一开始写的只能用min更新min,max更新max,实际上是可以互相更新的-- 首先看第二问, ...

  10. 鸟哥私房菜基础篇:Linux是什么习题

    猫宁!!! 参考链接:http://cn.linux.vbird.org/linux_basic/0110whatislinux.php#ex 鸟哥是为中国信息技术发展做出巨大贡献的人. 1-你在你的 ...