javaweb 文件下载基本编程

package com.itheima.download;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sun.misc.BASE64Encoder;

public class DownloadServlet extends HttpServlet {
    /*  

     * 编写让浏览器下载的Servlet程序

       准备工作:①工作空间的建立②文件配置③html文件创建,超链接④工具文件夹的vc导入---> 不想被外界访问v在web-inf里面

     * 实现步骤:  
     *   1. 获取被下载的图片的绝对路径
     *   2. 获取图片文件的MIME类型
     *   3. 设置响应头,告知浏览器响应的文件MIME类型
     *   4. 设置响应头,告知浏览器不要打开,请你下载
     *   5. IO读取图片,写会浏览器
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 获取被下载的图片的绝对路径
        String path = getServletContext().getRealPath("download/a.jpg");
        //2. 获取图片文件的MIME类型
        //ServletContext对象,方法,可以直接获取该文件的MIME类型
        String mime = getServletContext().getMimeType(path);
        //3. 设置响应头,告知浏览器响应的文件MIME类型
        response.setContentType(mime);
        
        

        String filename = "美女.jpg";  //这是根据功能实现的需要,自己编写文件类型的名字,不是固定格式

        String agent = request.getHeader("User-Agent");

        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");
        }


//但是,如果下载中文文件,页面在下载时会出现中文乱码或不能显示文件名的情况,原因是不同的浏览器默认对下载文件的编//码方式不同,ie是UTF-8编码方式,而火狐浏览器是Base64编码方式。所里这里需要解决浏览器兼容性问题,解决浏览器兼容//性问题的首要任务是要辨别访问者是ie还是火狐(其他),通过Http请求体中的一个属性可以辨别.所以紫色部分可以直接拿过//来用就可以,但是要注意导包的正确,核对导包在最上面



        
        //4. 设置响应头,告知浏览器不要打开,请你下载

        response.setHeader("Content-Disposition","attachment;filename="+filename);      //这是官方的编写格式,不能修改,直接vc拿来用即可


        //5. IO读取图片,写会浏览器
        FileInputStream fis = new FileInputStream(path);
        OutputStream out = response.getOutputStream();
        byte[] bytes = new byte[1024];
        int len = 0 ;
        while((len = fis.read(bytes))!=-1){
            out.write(bytes, 0, len);
        }
        fis.close();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值