完美的java解决下载文件问题

最近在做一个下载功能,这应该是比较简单的问题了,但却碰到一个非常奇怪的问题。点击下载以后,显示的却是如下的显示框:

172120_HfXL_2652412.png

将文件下载下来,修改后缀却发现,这个文件已经下载下来了,只是要手工修改后缀才行

172246_a2fM_2652412.png

一看后台代码,已经设置了文件名,但却没有起到任何的作用,更奇怪的是,要下载的文件我将文件外面的《要下载的文件》  "《》"给删除掉,下载下来的文件名成了一道 杠,网上搜索了相关的代码,然后照着写了几个,却没有任何作用。最后发现问题的关键在于用普通的字节流并没有将这些代码带到要下载文件中。

如下解决方案:

前端代码

172846_aSt6_2652412.png

后端173058_2H1k_2652412.png

关键代码:

//找到服务器放置文件的位置
        String url = request.getSession().getServletContext().getRealPath("resources/downRequisition/");
        String fileName = hashMap.get(request.getParameter("filename"));
        String fileUrl = url + fileName;

        OutputStream toClient = null;
        try {
            File file = new File(fileUrl);
            String filename = file.getName();
            // 以流的形式下载文件。
            InputStream fis = new BufferedInputStream(new FileInputStream(fileUrl));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            // 清空response
            response.reset();
            if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0)    {
                filename = new String(filename.getBytes("UTF-8"), "ISO8859-1");//firefox浏览器
            } else{
                filename = URLEncoder.encode(filename, "UTF-8");
            }
            // 设置response的Header
            response.addHeader("Content-Disposition", "attachment;filename=" + filename);
            response.addHeader("Content-Length", "" + file.length());
            toClient = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/octet-stream");
            toClient.write(buffer);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (toClient != null) {
                toClient.flush();
                toClient.close();
            }
        }

        //返回null为了解决 has already been called for this response错误
        return null;

如上代码和我之前的代码最大不同是他使用的是字符流的形式,同时,这些设置文件的名字以及文件长度、类型也是在流里面的时候写入的

转载于:https://my.oschina.net/sprouting/blog/716329

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值