您的位置:首页 > 编程语言 > Java开发

java实现阿里OSS服务器多文件打包ZIP下载,批量下载

2018-03-28 18:13 2276 查看
阿里oss服务器官方文档只有单文件下载, 断点下载等,但实际应用中不乏需要实现多文件下载的时候,于是网上各种查资料,查出来很多都是只有下载或者只有压缩的,于是自己整合代码,最终实现了多文件打包成ZIP压缩文件下载。
下面直接上代码:
public static HttpServletResponse zipFilesDown(String key,HttpServletRequest request, HttpServletResponse response){
// endpoint以杭州为例,其它region请按实际情况填写
String endpoint = "oss-cn-shanghai.aliyuncs.com";
// 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String bucketName = "<yourBucketName>";
try {
// 初始化
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);;
String fileName = "test.zip";
// 创建临时文件
File zipFile = File.createTempFile("test", ".zip");
FileOutputStream f = new FileOutputStream(zipFile);
/**
* 作用是为任何OutputStream产生校验和
* 第一个参数是制定产生校验和的输出流,第二个参数是指定Checksum的类型 (Adler32(较快)和CRC32两种)
*/
CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());
// 用于将数据压缩成Zip文件格式
ZipOutputStream zos = new ZipOutputStream(csum);

String[] keylist = key.split(",");
for (String ossfile : keylist) {
// 获取Object,返回结果为OSSObject对象
OSSObject ossObject = ossClient.getObject(bucket, ossfile);
// 读去Object内容  返回
InputStream inputStream = ossObject.getObjectContent();
// 对于每一个要被存放到压缩包的文件,都必须调用ZipOutputStream对象的putNextEntry()方法,确保压缩包里面文件不同名

zos.putNextEntry(new ZipEntry(ossfile.split("/")[2]));
int bytesRead = 0;
// 向压缩文件中输出数据
while((bytesRead=inputStream.read())!=-1){
zos.write(bytesRead);
}
inputStream.close();
zos.closeEntry(); // 当前文件写完,定位为写入下一条项目
}
zos.close();
String header = request.getHeader("User-Agent").toUpperCase();
if (header.contains("MSIE") || header.contains("TRIDENT") || header.contains("EDGE")) {
fileName = URLEncoder.encode(fileName, "utf-8");
fileName = fileName.replace("+", "%20");    //IE下载文件名空格变+号问题
} else {
fileName = new String(fileName.getBytes(), "ISO8859-1");
}
response.reset();
response.setContentType("text/plain");
response.setContentType("application/octet-stream; charset=utf-8");
response.setHeader("Location", fileName);
response.setHeader("Cache-Control", "max-age=0");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

FileInputStream fis = new FileInputStream(zipFile);
BufferedInputStream buff = new BufferedInputStream(fis);
BufferedOutputStream out=new BufferedOutputStream(response.getOutputStream());
byte[] car=new byte[1024];
int l=0;
while (l < zipFile.length()) {
in
8ee8
t j = buff.read(car, 0, 1024);
l += j;
out.write(car, 0, j);
}
// 关闭流
fis.close();
buff.close();
out.close();

ossClient.shutdown();
// 删除临时文件
zipFile.deleteOnExit();
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
经测算基本可以满足应用需求,细节部分不是很完善,记录备用
版权声明:本文为原创,转载需标明出处: https://blog.csdn.net/max3215/article/details/79731511
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息