一、问题描述
需求:
通过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;
}
}
网上没有找到解决此情况的乱码问题,特此记录!