Javaweb学习笔记10—文件上传与下载



今天来讲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* 下载中文乱码问题:

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

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

 

   

时间: 2024-10-13 03:08:08

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

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

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

学习笔记_springmvc文件上传和拦截器

文件上传 用到这两个包 配置视图解析器:springmvc配置文件配置 <!-- id必须要是"multipartResolver" --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- maxUploadSize文件上传的最大值,单位是byte

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

在火狐浏览器上传文件 上传前,同一个HTML文件在火狐和Edge浏览器显示有些不同 这是Firefox浏览器的显示 这是Edge浏览器 上传后 1 # coding = utf-8 2 3 from selenium import webdriver 4 import os 5 import time 6 7 dr = webdriver.Firefox() 8 file_path = "file:///" + os.path.abspath('upfile.html') 9 dr.g

Codeigniter入门学习笔记11—文件上传

很久很久以前学习Codeigniter的笔记记录,很随意,但都是自己记录的,希望对需要的人有所帮助. 本文使用word2013编辑并发布 Postbird | There I am , in the world more exciting! Postbird personal website : http://www.ptbird.cn 文件上传 1.手动创建好上传目录 2.controllers/user ? 3.views/user/fileAction.php ????//表单需要强调是文

javaweb学习总结(五)-文件上传

一.手动实现文件上传 1.指定表单类型为文件上传表单 2.提交方式必须为:POST <form enctype="multipart/form-data" method="post" action="${pageContext.request.ContextPath}/test"> 用户名:<input type="text" name="username"/>文件:<inpu

Struts2学习笔记(十一)——文件上传下载

1.单文件上传 单文件上传步骤: 1)创建上传jsp页面 文件上传的表单提交方式必须是POST方式,编码类型:enctype="multipart/form-data",默认是 application/x-www-form-urlencoded,比如: 1 <form action="${pageContext.servletContext.contextPath}/uploadAction.action" enctype="multipart/fo

SpringMVC 学习笔记(八)文件上传

Spring MVC 为文件上传提供了直接的支持,这种支持是通过即插即用的 MultipartResolver 实现的.Spring 用Jakarta Commons FileUpload 技术实现了一个MultipartResolver 实现类:CommonsMultipartResovler Spring MVC 上下文中默认没有装配 MultipartResovler,因此默认情况下不能处理文件的上传工作,如果想使用 Spring的文件上传功能,需现在上下文中配置 MultipartRes

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

SpringMVC--文件上传 说明: 文件上传的途径 文件上传主要有两种方式: 1.使用Apache Commons FileUpload元件. 2.利用Servlet3.0及其更高版本的内置支持. 客户端编程 1.为了上传文件,必须将HTML表格的enctype属性值设为multipart/form-data,像下面这样: <form action="action" enctype="multipart/form-data" method="po

Struts2笔记——10.文件上传

只有当表单的method为post,并且enctype要设置为multipart/form-data时,本地的二进制文件才能够上传到服务器.Struts2本身并不会去解析multipart/form-data,而是需要借助其他框架,所以它的上传功能需要依赖Common-FileUpload.COS等组件.相应的,我们需要把commons-io包跟commons-fileupload包添加到项目中.Struts2对原有的上传解析器做了进一步的封装,使用起来更加简便. 实现文件上传的action S