如何使用Servlet自己写一个文件的下载

这里写图片描述

需要将WebRoot目录下的download里面的文件进行下载:

*简易的前端页面:

<h2>下载资源</h2>
<a href="servlet/Demo01?filename=aa.jpg">aa.jpg</a><br/>
<a href="servlet/Demo01?filename=bb.txt">bb.txt</a><br/>
<a href="servlet/Demo01?filename=cc.rar">cc.rar</a><br/>
<a href="servlet/Demo01?filename=黑马.png">黑马.png</a>

需要注意的是这里面有中文文件名,在请求时,需要设置请求时的文件名字进行转码吧变成utf-8;
在发送给页面进下载的时候,不是使用response.setContentType("text/html;charset=UTF-8");
因为这是设置响应体的内容编码为utf-8
但是文件在下载的时候需要的文件名(中文)不是在请求体重,所以要使用有一个工具类:
base64EncodeFileName

具体代码实现如下:

public class Demo01 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置响应数据的编码格式
        // response.setContentType("text/html;charset=UTF-8");
        // 1.获取要写在的资源文件的名字
        String filename = request.getParameter("filename");
        filename = new String(filename.getBytes("iso-8859-1"),"utf-8");

System.out.println("filename" + filename);
        // 2.获取这个文件在tomcat里面的绝对路径
        String path = getServletContext().getRealPath("download/" + filename);
        /**
         * 如果文件的名字带有中文,那么就需要对这个文件名字进行编码处理
         * 
         * 如果是IE或者Chrome浏览器,使用URLEncoding编码
         * 如果是FireFox,使用Base64编码
         */
        if(request.getHeader("User-Agent").contains("FireFox")) { // 火狐浏览器
            filename = base64EncodeFileName(filename);
        } else { // IE跟Chrome浏览器
            filename = URLEncoder.encode(filename, "UTF-8");
        }
System.out.println(filename);
        response.setHeader("Content-Disposition", "attachment; filename=" + filename);

        // 3.转换成输入流 
        InputStream is = new FileInputStream(path);

        OutputStream os = response.getOutputStream();
        int len = 0;
        byte[] buffer = new byte[1024];
        while((len = is.read(buffer)) != -1) {
            os.write(buffer, 0, len);
        }
        os.close();
        is.close();
    }

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

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38200548/article/details/80593357