文件下载案例 January 27,2020

## 案例:
* 文件下载需求:
  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 web.download;

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 {
        //1.获取请求参数---文件名称
        String filename = request.getParameter("filename");
        //2.使用字节输入流加载文件进内存
        //2.1找到文件服务器路径
        ServletContext servletContext = this.getServletContext();
        String realPath = servletContext.getRealPath("/img/"+filename);
        //2.2用字节流关联
        FileInputStream fileInputStream = new FileInputStream(realPath);
        //3.设置response的响应头
        //3.1设置响应头类型:content-type

        String mimeType = servletContext.getMimeType(filename);
        response.setHeader("content-type",mimeType);
         /* 解决中文文件名问题
            //1.获取user-agent请求头、
            String agent = request.getHeader("user-agent");
            //2.使用工具类方法编码文件名即可
            filename = DownLoadUtils.getFileName(agent, filename);
           */
        //3.2设置响应头打开方式:content-disposition
        response.setHeader("content-disposition","attachment;filename="+filename);
        //4.将输入流的数据写出到输出流中
        ServletOutputStream sos = response.getOutputStream();
        byte [] buff = new byte[1024*8];
        int count = fileInputStream.read(buff);
        while (count!=-1){
            sos.write(buff,0,count);
            count = fileInputStream.read(buff);
        }
        fileInputStream.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}
package web.utils;
/*
import sun.misc.BASE64Encoder;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class DownLoadUtils {

    public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
        if (agent.contains("MSIE")) {
            // IE浏览器
            filename = URLEncoder.encode(filename, "utf-8");
            filename = filename.replace("+", " ");
        } else if (agent.contains("Firefox")) {
            // 火狐浏览器
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
        } else {
            // 其它浏览器
            filename = URLEncoder.encode(filename, "utf-8");
        }
        return filename;
    }
}*/

原文地址:https://www.cnblogs.com/yyanghang/p/12236061.html

时间: 2024-11-11 15:49:24

文件下载案例 January 27,2020的相关文章

Response验证码案例 January 27,2020

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>验证码点击切换</title> <script> /* 分析: 点击超链接或者图片,需要换一张 1.给超链接和图片绑定单击事件 2.重新设置图片的src属性值 */ window.onload=function () {//加载完毕后 var i

Session &amp; Cookie登录案例 January 27,2020

## 案例:验证码 1. 案例需求: 1. 访问带有验证码的登录页面login.jsp 2. 用户输入用户名,密码以及验证码. * 如果用户名和密码输入有误,跳转登录页面,提示:用户名或密码错误 * 如果验证码输入有误,跳转登录页面,提示:验证码错误 * 如果全部输入正确,则跳转到主页success.jsp,显示:用户名,欢迎您 2. 分析: package domain; /** * 用户 实体类 */ public class User { private int id; private S

HTTP协议 January 27,2020

## HTTP协议:一.请求消息:客户端发送给服务器端的数据 * 数据格式: 1. 请求行 2. 请求头 3. 请求空行 4. 请求体 二.响应消息:服务器端发送给客户端的数据 * 数据格式: 1. 响应行 1. 组成:协议/版本 响应状态码 状态码描述 2. 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态. 1. 状态码都是3位数字 2. 分类: 1. 1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码 2. 2xx:成功.代表:200 3. 3xx:

Response January 27,2020

## Response对象 * 功能:设置响应消息 1. 设置响应行 1. 格式:HTTP/1.1 200 ok 2. 设置状态码:setStatus(int sc) 2. 设置响应头: setHeader(String name, String value) 3. 设置响应体: * 使用步骤: 1. 获取输出流 * 字符输出流:PrintWriter getWriter() * 字节输出流:ServletOutputStream getOutputStream() 2. 使用输出流,将数据输出

Session January 27,2020

## Session:主菜 一.概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中.HttpSession 二.快速入门: 1. 获取HttpSession对象: HttpSession session = request.getSession(); 2. 使用HttpSession对象: Object getAttribute(String name) void setAttribute(String name, Object value) void remo

ES &amp; JSTL January 27,2020

## JSP: 一.指令 * 作用:用于配置JSP页面,导入资源文件 * 格式: <%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %> * 分类: 1. page : 配置JSP页面的 * contentType:等同于response.setContentType() 1. 设置响应体的mime类型以及字符集 2. 设置当前jsp页面的编码(只能是高级的IDE才能生效,如果使用低级工具,则需要设置pageEncoding属性设置当前页面的字符集) * import:导包 *

Java 之 Response 文件下载案例

文件下载需求: 1. 页面显示超链接 2. 点击超链接后弹出下载提示框 3. 完成图片文件下载 分析过程: 1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框.不满足需求 2. 任何资源都必须弹出下载提示框 3. 使用响应头设置资源的打开方式: content-disposition:attachment;filename=xxx 步骤: 1. 定义页面,编辑超链接href属性,指向Servlet,传递资源名称filename 2. 定义Servlet

January 27 2017 Week 4 Friday

Procrastination is the thief of time. 拖延是时光之贼. Procrastination is the thief of time, besides, it is the killer of your life. Just do what you want to do, and something will change, no matter good or bad, it will change. I had maken too many choices,

文件下载案例

一.需求分析 其中,浏览器可以直接解析图片,不能解析视频,所以视频的超链接是下载: 加载文件,则需要知道文件的真是路径(ServletContext); 前端: 二.代码实现 其中,ServletOutputStream字节流会自动刷新,即自动将缓冲区的数据持久化到真实文件流中,不用手动刷新和关闭,servlet服务结束会自动销毁: 三.解决文件乱码问题 1.原因是因为不同的浏览器编码不一样,版本不同兼容性也不同: 解决方法是根据请求头判断浏览器,设置对应的响应: 2.代码实现 这是根据不同的浏