java下载多个网络文件并压缩成压缩包保存到本地
背景
开发票的时候远程会返回发票的url,现在客户端需要下载发票;因为一个订单可能不止一张发票,因此需要通过网络把远程的文件下载回来并压缩成压缩文件进行返回。
实现
本文的例子直接基于java.net包下面的类实现。(因为是基于网络下载文件,因此文件必须能通过类似于网络的方式访问)
适合静态文件、接口文件流下载等。
如果确定是静态文件的,也可以直接根据下载url来截取获取文件名及后缀,稍微改一下即可。
如果效果不符合,仔细检查文件名是否有问题。
import org.apache.commons.lang.StringUtils;
import java.io.*;
import java.net.URL;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* @ClassName: FileDownloadUtils
* @Author: yumoxuan
* @Date: 2025/3/6 16:25
* @Description:
**/
public class FileDownloadUtils {
/**
*
* @param urls 一个存放map的list;每个map存放一个远程文件路径url、一个本地文件名name;文件名可以通过增加filename/来调整压缩包内文件的层级
* @param zipFileUrl 压缩文件名称,使用相对或绝对路径,包含文件名及后缀
* @return
* @throws IOException
*/
public static void getZieFile(List<Map<String,String>> urls,String zipFileUrl) throws IOException {
if (urls == null || urls.size() == 0 || StringUtils.isBlank(zipFileUrl)) {
//是否要抛异常
return ;
}
File zipFile = new File(zipFileUrl);
File parentFile = zipFile.getParentFile();
// if(zipFile.exists()){
// //去掉会覆盖已存在的文件
// return;
// }
if(!parentFile.exists()){
parentFile.mkdirs();
}
zipFile.createNewFile();
ZipOutputStream outputStream=new ZipOutputStream(new FileOutputStream(zipFile));
Set<String> distinctSet=new HashSet<>();
for(Map<String,String> map:urls){
String url = map.get("url");
String name = map.get("name");
if(distinctSet.contains(name)){
//重复名字的文件会导致压缩包内文件覆盖
continue;
}
distinctSet.add(name);
InputStream inputStream = new URL(url).openStream();
ZipEntry zipEntry = new ZipEntry(name);
outputStream.putNextEntry(zipEntry);
byte[] bytes = new byte[1024];
int len = 0;
while ((len = inputStream.read(bytes)) > 0) {
outputStream.write(bytes, 0, len);
}
outputStream.closeEntry();
}
outputStream.finish();
outputStream.close();
}
public static void main(String[] args) {
String zipFileUrl="C:\\Users\\Administrator\\Documents\\发票\\test\\test1\\TestZip.zip";
List<Map<String,String>> list=new ArrayList<>();
Map<String,String> map=new HashMap<>();
map.put("url","https://i-blog.csdnimg.cn/direct/6a9dff58549c40d5a94418a2162fae9b.jpeg");
map.put("name","photo.jpg");
Map<String,String> map1=new HashMap<>();
map1.put("name","addfile/table.png");
map1.put("url","https://profile-avatar.csdnimg.cn/22ce7a74c84f44b48b361d4f7aeb1b85_weixin_43975276.jpg!1");
list.add(map);
list.add(map1);
try {
getZieFile(list,zipFileUrl);
} catch (IOException e) {
e.printStackTrace();
}
}
}
结果
运行前:
运行后:成功下载到本地并压缩成压缩包,addfile/table.png也成功生成了一个文件夹并在文件夹内放table.png.