吉林網(wǎng)站模板系統(tǒng)優(yōu)化助手
背景
開發(fā)票的時候遠(yuǎn)程會返回發(fā)票的url,現(xiàn)在客戶端需要下載發(fā)票;因為一個訂單可能不止一張發(fā)票,因此需要通過網(wǎng)絡(luò)把遠(yuǎn)程的文件下載回來并壓縮成壓縮文件進(jìn)行返回。
實現(xiàn)
本文的例子直接基于java.net包下面的類實現(xiàn)。(因為是基于網(wǎng)絡(luò)下載文件,因此文件必須能通過類似于網(wǎng)絡(luò)的方式訪問)
適合靜態(tài)文件、接口文件流下載等。
如果確定是靜態(tài)文件的,也可以直接根據(jù)下載url來截取獲取文件名及后綴,稍微改一下即可。
如果效果不符合,仔細(xì)檢查文件名是否有問題。
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存放一個遠(yuǎn)程文件路徑url、一個本地文件名name;文件名可以通過增加filename/來調(diào)整壓縮包內(nèi)文件的層級* @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)){//重復(fù)名字的文件會導(dǎo)致壓縮包內(nèi)文件覆蓋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\\發(fā)票\\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();}}
}
結(jié)果
運行前:
運行后:成功下載到本地并壓縮成壓縮包,addfile/table.png也成功生成了一個文件夾并在文件夾內(nèi)放table.png.