/**
* 批量下載為zip
* @param req
* @param response
* @param keyList oss文件路徑集合
* @param fileName 下載出來的zip文件名(一般以合同名命名) 如:測試合同,zip
*/
public static void downForZip(HttpServletRequest req, HttpServletResponse response,
List<String> keyList,String fileName ){
// 創建臨時文件
File zipFile = null;
try {
//臨時文件名稱
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);
OSSClient ossClient= OSSUtil.getInstance();
for (String ossFile : keyList) {
// 獲取Object,返回結果為OSSObject對象
OSSObject ossObject = ossClient.getObject(OSSUtil.BUCKET, ossFile);
// 讀去Object內容 返回
InputStream inputStream = ossObject.getObjectContent();
// 對於每一個要被存放到壓縮包的文件,都必須調用ZipOutputStream對象的putNextEntry()方法,確保壓縮包里面文件不同名
String name=ossFile.substring(ossFile.lastIndexOf("/")+1);
zos.putNextEntry(new ZipEntry(name));
int bytesRead = 0;
// 向壓縮文件中輸出數據
while ((bytesRead = inputStream.read()) != -1) {
zos.write(bytesRead);
}
inputStream.close();
zos.closeEntry(); // 當前文件寫完,定位為寫入下一條項目
}
zos.close();
String header = req.getHeader("User-Agent").toUpperCase();
if (header.contains("MSIE") || header.contains("TRIDENT") || header.contains("EDGE")) {
fileName = URLEncoder.encode(fileName, "utf-8");
//IE下載文件名空格變+號問題
fileName = fileName.replace("+", "%20");
} 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()) {
int j = buff.read(car, 0, 1024);
l += j;
out.write(car, 0, j);
}
// 關閉流
fis.close();
buff.close();
out.close();
ossClient.shutdown();
// 刪除臨時文件
zipFile.delete();
} catch (IOException e1) {
e1.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
}