使用HttpServletResponse实现下载文件

编码前的准备

使用HttpServletResponse实现下载文件_第1张图片

1.download文件夹中放置需要下载的文件

2.download文件夹放置在WebContent目录下

下载页面(index.html)


<html>
<head>
<meta charset="UTF-8">
<title>Insert title heretitle>
head>
<body>
    <h2>手动下载文件h2><br>
    <a href="Demo?filename=aa.jpg">aa.jpga><br>
    <a href="Demo?filename=bb.txt">bb.txta><br>
    <a href="Demo?filename=cc.rar">cc.rara><br>
    <a href="Demo?filename=黑马.png">黑马.pnga><br>
body>
html>

请求发送给名为Demo的Servlet处理,并传递文件名filename=**。

Demo中的代码

代码中使用了DownloadUtil的工具类

package com.mbc.servlet;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
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;


public class Demo extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.获取要下载的文件的名字
        String filename = request.getParameter("filename");

        //点击下载链接后,发送过来的是get请求,所以会出现中文乱码的问题。
        //解决因为中文乱码,而找不到相应文件的问题
        filename = new String(filename.getBytes("ISO-8859-1"), "UTF-8"); 

        //2.获取文件在Tomcat中的路径
        String path = this.getServletContext().getRealPath("download/"+filename);

        //3.获取下载的文件流
        InputStream is = new FileInputStream(path);

        //4.获取输出流
        OutputStream os = response.getOutputStream();

        //解决当文件名存在中文时,下载框中的中文无法显示的问题。
        //方法一
        //这里要分两种情况
        //1.火狐浏览器(需要将文件名转为base64编码格式)
        //2.IE、谷歌浏览器....等浏览器(需要将文件名转为application/x-www-form-urlencoded MIME)
        //(1)获取浏览器信息
//      String userAgent = request.getHeader("User-Agent");
//      System.out.println(userAgent);
        //(2)根据浏览器判断使用哪种编码格式
//      if(userAgent.contains("Firefox")) {
//          filename = DownloadUtil.base64EncodeFileName(filename);
//      }else {
//          filename = URLEncoder.encode(filename, "utf-8");
//      }

        //方法二
        filename=new String(filename.getBytes("utf-8"),"ISO-8859-1");
        //或
        //filename=new String(filename.getBytes("gbk"),"ISO-8859-1");
        //设置:当浏览器收到这份资源的时候,以下载的方式提醒用户,而不是直接显示
        response.setHeader("Content-Disposition", "attachment; filename=" + filename);
        byte[] buffer = new byte[1024];
        int len = 0;
        while((len = is.read(buffer)) != -1) {
            os.write(buffer, 0, len);
        }
        os.close();
        is.close();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

DownloadUtil代码

package com.mbc.servlet;

import java.io.UnsupportedEncodingException;

import sun.misc.BASE64Encoder;

public class DownloadUtil {
    public static String base64EncodeFileName(String fileName) {
        BASE64Encoder base64Encoder = new BASE64Encoder();
        try {
            return "=?UTF-8?B?"
                    + new String(base64Encoder.encode(fileName
                            .getBytes("UTF-8"))) + "?=";
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}

总结

1.获取request请求发送的数据中包含中文时,要处理乱码的问题。

2.解决下载框无法显示中文的问题。

3.解决了乱码问题之后,就是普通的IO流操作。

你可能感兴趣的:(JavaWeb基础)