• 下载的两种方式


    1.2.1下载
    1、直接建立资源链接的方法
    <h1>超链接方式</h1>
    <a href="mm.jpg">美女.jpg</a><br/>
    <a href="1.zip">美女帅哥.zip</a>
    该方式编写程序非常简单,但是有些资源就直接在浏览器中打开了(.jpg,.png,.html,.htm...).
    目前仅用在压缩包的下载。
    2、IO流的方式
    告诉浏览器以附件下载的方法打开。name为文件名称
    response.setHeader("Content-Disposition",
    "attachment;filename="+name);
    A.编写jsp
    <h1>IO流方式</h1>
    <a href="DownLoadServlet1?fname=mm.jpg">美女.jpg</a><br/>
    <a href="DownLoadServlet1?fname=1.zip">美女帅哥.zip</a>
    B.创建DowLoadServlet1
    ======================================================
    public class DownLoadServlet1 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    //1、接收参数
    String fname = request.getParameter("fname");
    //2、设置头通知,以附件下载的方式打开
    response.setHeader("Content-Disposition",
    "attachment;filename="+fname);
    //3、IO操作
    InputStream in = new FileInputStream(new File(getServletContext().getRealPath(fname)));
    //响应输出流 (new FileOutputStream(new File(fname));在服务器的项目根目录下创建一个文件)
    OutputStream out = response.getOutputStream();
    byte bts[] = new byte[1024];
    int len = -1;
    while((len=in.read(bts))!=-1){
    out.write(bts, 0, len);
    }
    in.close();
    }
    ...
    }
    ======================================================
    测试发现,英文或数字的文件名下载没有问题,如果文件为中文时,下载时出现
    问题:
    C1:文件名称乱码
    C2:下载后中文文件名消失。
    解决办法:
    ======================================================
    String fname = request.getParameter("fname");
    fname = new String(fname.getBytes("ISO8859-1"),"UTF-8");
    //2、设置头通知,以附件下载的方式打开
    response.setHeader("Content-Disposition",
    "attachment;filename="+URLEncoder.encode(fname, "UTF-8"));
    ======================================================
    补充:文件上传时,为了防止文件重名,一般在上传后将文件生产新的名称,
    该名称通常使用以下两种方式:IP时间戳(10804231201705051142123888.后缀)和 UUID产生字符串的方式。
    遗留:URLEncoder.encode(fname, "UTF-8")对中文文件名后,有些浏览器不能够自动识别(比如火狐浏览器)。
    3、文件转发的方法
    A.编写jsp
    ======================================================
    <h1>文件转发的方式</h1>
    <a href="${pageContext.request.contextPath }/DownLoadServlet2?fname=mm.jpg">美女(mm.jpg)</a><br/>
    <a href="${pageContext.request.contextPath }/DownLoadServlet2?fname=美女1.jpg">美女1.jpg</a><br/>
    <a href="${pageContext.request.contextPath }/DownLoadServlet2?fname=美女.jpg">美女.jpg</a><br/>
    <a href="${pageContext.request.contextPath }/DownLoadServlet2?fname=1.zip">美女帅哥.zip</a>
    ======================================================
    B.创建DownLoadServlet2
    ======================================================
    public class DownLoadServlet2 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    //1、接收参数、处理乱码
    String fname = request.getParameter("fname");
    fname = new String(fname.getBytes("ISO8859-1"),"UTF-8");
    //2、设置头通知,以附件下载的方式打开
    response.setHeader("Content-Disposition",
    "attachment;filename="+URLEncoder.encode(fname, "UTF-8"));
    //3、文件转发
    request.getRequestDispatcher(fname).forward(request, response);
    }
    ...
    }
    ======================================================
    3、测试
    ======================================================
    4总结:
    如果仅仅是几个压缩包下载的话,建议使用超链接。
    如果下载的文件各种类型的都有,不建议使用超链接的方式;
    可以选择后两种方式,如果文件都不是太大的话,自由选择;如果文件想
    实现一些自定义的一些功能(比如断点续传)建议使用IO流方式。

  • 相关阅读:
    冒泡排序
    Window中常见的dos命令
    spring boot 重定向
    阿里云轻量级服务器使用
    网络知识
    spring boot security 登出
    深入理解java虚拟机
    jsp内置对象与servlet的关系
    求一个有向无换图中,最长简单路径。动态规划问题15-1
    一些动态规划问题的java实现
  • 原文地址:https://www.cnblogs.com/pxffly/p/8482815.html
Copyright © 2020-2023  润新知