• Java-文件下载案例


    • 文件下载需求
      1.页面显示超链接
      2.点击超链接后弹出下载框
      3.完成图片文件下载
    • 分析
      1.超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框。不满足需求
      2.任何资源都必须弹出下载提示框
      3.使用响应头设置资源的打开方式
      * content-disposition:attachment;filename=xxx;
    • 步骤
      1.定义页面,编辑超链接href属性,指向Servlet,传递资源名称filename
      2.定义Servlet
      1.获取文件名称
      2.使用字节输入流加载文件进内存
      3.指定response的响应头:content-disposition:attachment;filename=xxx
      4.将数据写出到response输出流
    • 问题
      • 中文文件问题
        • 解决思路
          1.获取客户端使用的浏览器版本信息
          2.根据不同的版本信息,设置filename的编码方式

    代码如下

    package cn.itcast.web.servletcontext;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.FileInputStream;
    import java.io.IOException;
    
    @WebServlet("/DownloadServlet")
    public class DownloadServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //获取请求参数,文件名称
            String filename = request.getParameter("filename");
            //使用字节输入流加载文件进内存
            //找到文件服务器路径
            ServletContext servletContext = this.getServletContext();
            String realPath = servletContext.getRealPath("/img/" + filename);
            //用字节流关联
            FileInputStream fis = new FileInputStream(realPath);
            //设置response的响应头
            //设置响应头content-type
            String mimeType = servletContext.getMimeType(filename);//获取文件的MIME类型
            response.setHeader("content-type", mimeType);
            //设置响应头打开方式content-disposition
            response.setHeader("content-disposition", "attachment;filename" + filename);
            //将输入流的1数据写到输出流中
            ServletOutputStream sos = response.getOutputStream();
            byte[] buff = new byte[1024 * 8];
            int len = 0;
            while ((len = fis.read(buff)) != -1) {
                sos.write(buff, 0, len);
            }
            fis.close();
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    -------------------------------------------------------------------------------------
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <a href="/07_Response_war_exploded/img/1.jpg">图片1</a>
    <a href="/07_Response_war_exploded/DownloadServlet?filename=1.jpg">图片1</a>
    <a href="/07_Response_war_exploded/img/二.jpg">图片2</a>
    <a href="/07_Response_war_exploded/DownloadServlet?filename=二.jpg">图片2</a>
    </body>
    </html>
  • 相关阅读:
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    block的是发送信号的线程,又不是处理槽函数的线程
  • 原文地址:https://www.cnblogs.com/dongxuelove/p/13042269.html
Copyright © 2020-2023  润新知