zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    BA 的职责
    How to grow up as a BA
    打开struts-config.xml 报错 解决方法Could not open the editor
    eclipse中svn插件的工程不能与svn资源库同步的解决方法
    三种常用的MySQL建表语句(转)
    MySQL中CURRENT_TIMESTAMP(转)
    JavaWeb之CSS详解
    如何在Mac OSX系统下安装Tomcat
    JavaWeb之XML详解
    JavaWeb之HTML入门及常用标签
  • 原文地址:https://www.cnblogs.com/dongxuelove/p/13042269.html
Copyright © 2011-2022 走看看