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里面javaweb 文件下载基本编程_第1张图片

     * 实现步骤:  
     *   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);
    }
}

你可能感兴趣的:(javaweb 文件下载基本编程)