import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* 批量下载文件
*/
public class BulkDownloadFilesUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(BulkDownloadFilesUtil.class);
/**
* @param urls
* @param response
*/
public static void downFiles(Set<String> urls, HttpServletResponse response){
if(CollectionUtils.isEmpty(urls))
return;
//设置压缩流:直接写入response,实现边压缩边下载
ZipOutputStream zipos = null;
DataOutputStream os = null;
URL url = null;
InputStream input = null;
try {
zipos = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
zipos.setMethod(ZipOutputStream.DEFLATED); //设置压缩方法
for (String path : urls) {
if(path.startsWith("//"))
path = "http:" + path;
url = new URL(path);
HttpURLConnection httpUrl = (HttpURLConnection) url.openConnection();
httpUrl.connect();
httpUrl.getInputStream();
input = httpUrl.getInputStream();
zipos.putNextEntry(new ZipEntry(path.substring(path.lastIndexOf("/")+1)));
//文件写入压缩流
os = new DataOutputStream(zipos);
byte[] buf = new byte[2048];
int numBytesRead = 0;
while ((numBytesRead = input.read(buf)) != -1) {
os.write(buf, 0, numBytesRead);
}
zipos.closeEntry();
}
} catch (Exception e) {
LOGGER.error("文件压缩失败,地址:{}", JsonUtil.toJson(urls, false),e);
}finally {
IOUtils.closeQuietly(input);
IOUtils.closeQuietly(os);
IOUtils.closeQuietly(zipos);
}
}
}