通过URL下载文件,使用原始文件名乱码问题

一、问题描述

需求:通过URL下载文件,并保持在上传时的文件名
**问题:**通过下载,文件可以正常打开,但是名称为乱码!谷歌浏览器通过URL进行下载,则可展示正常的名字。

二、初始代码

public boolean downApprovalFile(String url) {
        try{
        HttpResponse execute = HttpRequest.get(url)
                .charset("ISO8859-1")  //设置没有效果,无论如何设置,文件名均乱码(考虑:服务端未根据这个参数进行自动设置)
                .execute();  //此方法位hutool工具类提供的方法,使用Java自带的URL下载也为乱码。
        InputStream inputStream = execute.bodyStream();
        String header = execute.header("Content-Disposition");

        String[] split = header.split(";");
        String filename= split[1].substring(9);
        
        OutputStream outputStream = new FileOutputStream(FileUtil.file("D:/temp"+File.separator+filename));

        IOUtils.copy(inputStream,outputStream);  //此方法位hutool工具类提供的方法,下载

        //long size = HttpUtil.downloadFile(url, FileUtil.file("D:/temp")); //此方法位hutoo工具类提供的下载方法,下载的结果也使乱码!
        long size = HttpUtil.download(url, outputStream, true);
        return true;
        }catch (Exception e){
            e.printStackTrace();
            log.error("【下载本地失败!】");
            return false;
        }
    }

使用上面的两个下载方法,均为乱码,查度娘也没找到解决办法,大多都是指定一个名称进行下载。

三、解决办法

进行传输时,实际是流进行传输,所以可以将传输的名称转换成byte[]数组,然后再以特定的编码格式转换回来,代码示例如下:

public boolean downApprovalFile(String url) {
        try{
        HttpResponse execute = HttpRequest.get(url)
                //.charset("ISO8859-1")  //设置没有效果,无论如何设置,文件名均乱码(考虑:服务端未根据这个参数进行自动设置)
                //.charset("UTF-8")
                .execute();
        InputStream inputStream = execute.bodyStream();
        String header = execute.header("Content-Disposition");

        String[] split = header.split(";");
        String substring = split[1].substring(9);
        byte[] bytes = substring.getBytes("ISO8859-1"); // 此参数必须,为服务端提供下载时设置文件名的编码格式(ps:我是一个一个测试出来的,因为不确定服务器给转成什么格式了)

        String filename = new String(bytes, "UTF-8"); // 转成你本地能识别的编码格式!我本地配置的UTF-8

        OutputStream outputStream = new FileOutputStream(FileUtil.file("D:/temp"+File.separator+filename));

        IOUtils.copy(inputStream,outputStream); //此方法下载,不出现乱码!

        //long size = HttpUtil.downloadFile(url, FileUtil.file("D:/temp"));
        long size = HttpUtil.download(url, outputStream, true); //该方法仍乱码,hutool内部没有做处理,也没有提供可用api
        return true;
        }catch (Exception e){
            e.printStackTrace();
            log.error("【下载本地失败!】");
            return false;
        }
    }

网上没有找到解决此情况的乱码问题,特此记录!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值