zoukankan      html  css  js  c++  java
  • 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-312015-04-01

     

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

     

         * 按照用户ID分目录:user1user2

     

         ④* 使用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* 下载对应文件时,下载文件名称中文乱码:

     

     

     

     

  • 相关阅读:
    I/O性能优化
    磁盘性能指标
    磁盘I/O工作原理
    文件系统工作原理
    Linux命令行工具之free命令
    内存性能优化
    内存工作原理
    内存中的Buffer和Cache的区别
    proc文件系统
    oracle 查询 LOB 字段大小
  • 原文地址:https://www.cnblogs.com/jinfulin/p/4392935.html
Copyright © 2011-2022 走看看