JavaWeb文件下载

文件下载流

Javaweb下载就是向客户端相应字节数据。原来我们响应的都是html的字符数据,下载需要把一个文件变成字节数组,使用response.getOutputStream()来响应给客户端。

 

下载要求

两个头一个流
    > Content-Type:你传递给客户端的文件是什么MIME类型,例如:image/pjpeg
      * 通过文件名称调用ServletContext的getMimeType()方法,得到MIME类型!
    > Content-Disposition:它的默认值为inline,表示在浏览器窗口中打开!attachment;filename=xxx
      * 在filename=后面跟随的是显示在下载框中的文件名称!
    > 一个流:要下载的文件数据!
      * 自己new一个输入流即可!

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String fileName="G:/成绩单.jpeg";

        /**
         * 两个头
         * content-type
         * content-disposition
         * 一个流:下载文件的数据
         */
        //获取文件的mime类型
        String contentType=request.getServletContext().getMimeType(fileName);
        String contentDisposition="attachment;filename=a.jpeg";

        //一个流
        FileInputStream in=new FileInputStream(fileName);

        response.setContentType(contentType);
        response.setHeader("Content-Disposition",contentDisposition);

        //获取绑定了相应端的输出流
        ServletOutputStream out=response.getOutputStream();

        IOUtils.copy(in,out);
        in.close();//关闭输入流
        out.close();//关闭输出流


    }

 

下载文件名称编码

显示在下载框中的中文名称时,会出现乱码。
  * FireFox:Base64编码。
  * 其他大部分浏览器:URL编码。

有两种方案:

方案一:

filename = new String(filename.getBytes("GBK"), "ISO-8859-1");

这总方案不一定都有效(测试时谷歌、火狐、exploter11都可以,但是Microsoft Edge乱码)

方案二:(通用,推荐)

/**
     * 解决下载文件的中文名称乱码
     * @param filename
     * @param request
     * @return
     * @throws IOException
     */
    public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException {
        String agent = request.getHeader("User-Agent"); //获取浏览器
        if (agent.contains("Firefox")) {
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filename = "=?utf-8?B?"
                    + base64Encoder.encode(filename.getBytes("utf-8"))
                    + "?=";
        } else if(agent.contains("MSIE")) {
            filename = URLEncoder.encode(filename, "utf-8");
        } else {
            filename = URLEncoder.encode(filename, "utf-8");
        }
        return filename;
    }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值