/**
* 從阿里雲下載文件 (以附件形式下載) 多個文件進行zip下載 第二種
* @param request
* @param response
*/
@ResponseBody
@RequestMapping(value = "/zipFilesDown", method = RequestMethod.GET)
public void zipFilesDown(HttpServletRequest request, HttpServletResponse response){
String userId = request.getParameter("userId");
//阿里雲基礎配置
String endpoint = OSSConstants.OSS_ENDPOINT;
String accessKeyId = OSSConstants.OSS_ACCESS_KEY_ID;
String accessKeySecret = OSSConstants.OSS_ACCESS_KEY_SERCRET;
String bucketName = OSSConstants.OSS_BUCKET_NAME_ONE;
String fileHost = OSSConstants.OSS_FILE_HOST;
try {
// 初始化
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);;
String fileName = userId + ".zip";
// 創建臨時文件
File zipFile = File.createTempFile(userId, ".zip");
FileOutputStream f = new FileOutputStream(zipFile);
CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());
// 用於將數據壓縮成Zip文件格式
ZipOutputStream zos = new ZipOutputStream(csum);
// 構造ListObjectsRequest請求。
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
// 列出userId目錄下的所有文件和文件夾。
listObjectsRequest.setPrefix(fileHost + "/" + userId + "/");
ObjectListing listing = ossClient.listObjects(listObjectsRequest);
// 遍歷所有文件。
System.out.println("Objects:");
for (OSSObjectSummary ossObjectSummary : listing.getObjectSummaries()) {
System.out.println(ossObjectSummary.getKey());
String eachFileName = ossObjectSummary.getKey().substring(ossObjectSummary.getKey().lastIndexOf("-")+1);
// 獲取Object,返回結果為OSSObject對象
OSSObject ossObject = ossClient.getObject(bucketName, ossObjectSummary.getKey());
// 讀去Object內容 返回
InputStream inputStream = ossObject.getObjectContent();
// 對於每一個要被存放到壓縮包的文件,都必須調用ZipOutputStream對象的putNextEntry()方法,確保壓縮包里面文件不同名
zos.putNextEntry(new ZipEntry(eachFileName));
int bytesRead;
// 向壓縮文件中輸出數據
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()) {
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 (Exception e) {
e.printStackTrace();
}
}
滿足了自己的開發需求,本人比較偷懶省事,直接把原作者的代碼copy過來記錄一下。
參考原文:https://blog.csdn.net/m0_37844800/article/details/81068833
