import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.OSSObject;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.COSObject;
import com.qcloud.cos.region.Region;
import com.wqh.fsrm.common.util.DateUtils;
import org.springframework.web.bind.annotation.GetMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.zip.Adler32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class CosDownloadUtil {
public static final String secretId = "AKIDC9xVnoZv4vWyiByPM5XjlW0TglcBdaR1";
public static final String secretKey = "g6KKBn8JDqCRSDKJcePt63jhOs87q65n";
public static final String bucket = "polz-files-1302700757";
public static final String regionString = "ap-shanghai";
public static final String url = "https://polz-files-1302700757.cos.ap-shanghai.myqcloud.com";
public static COSClient getCOSClient(){
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
Region region = new Region(regionString);
ClientConfig clientConfig = new ClientConfig(region);
clientConfig.setHttpProtocol(HttpProtocol.https);
COSClient cosClient = new COSClient(cred, clientConfig);
return cosClient;
}
public void getZipFile(HttpServletResponse response, HttpServletRequest request) {
String fileKeys = request.getParameter("fileKeys");
if (null == fileKeys || fileKeys.length() == 0) {
return;
}
String[] keys = fileKeys.split(",");
if (keys == null || keys.length <= 0) {
return;
}
try {
// 初始化
COSClient cosClient = getCOSClient();
String times = DateUtils.generateTimestampNo();
String fileName = times.concat(".zip");
// 创建临时文件
java.io.File zipFile = java.io.File.createTempFile(times, ".zip");
FileOutputStream f = new FileOutputStream(zipFile);
/**
* 作用是为任何OutputStream产生校验和
* 第一个参数是制定产生校验和的输出流,第二个参数是指定Checksum的类型 (Adler32(较快)和CRC32两种)
*/
CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());
// 用于将数据压缩成Zip文件格式
ZipOutputStream zos = new ZipOutputStream(csum);
for (String key : keys) {
File file = new File(key);
String mimeType = URLConnection.guessContentTypeFromName(file.getName());
InputStream inputStream = null;
if ("mp4".equals(mimeType)) { //如果是mp4 格式需要直接从服务器上下载
HttpURLConnection httpURLConnection = null;
URL url = new URL(key);
httpURLConnection = (HttpURLConnection) url.openConnection();
// 设置网络连接超时时间
httpURLConnection.setConnectTimeout(3000);
// 设置应用程序要从网络连接读取数据
httpURLConnection.setDoInput(true);
httpURLConnection.setRequestMethod("GET");
int responseCode = httpURLConnection.getResponseCode();
if (responseCode == 200) {
// 从服务器返回一个输入流
inputStream = httpURLConnection.getInputStream();
}
} else {
//m.setFileUrl(hoeOssUrl + m.getFileUrl());
COSObject cosObject = cosClient.getObject(bucket, key);
inputStream = cosObject.getObjectContent();
}
// 对于每一个要被存放到压缩包的文件,都必须调用ZipOutputStream对象的putNextEntry()方法,确保压缩包里面文件不同名
if (null == key || key.length() == 0) {
continue;
}
int len = key.split("/").length;
zos.putNextEntry(new ZipEntry(key.split("/")[len - 1]));
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()) {
int j = buff.read(car, 0, 1024);
l += j;
out.write(car, 0, j);
}
// 关闭流
fis.close();
buff.close();
out.close();
cosClient.shutdown();
// 删除临时文件
zipFile.delete();
} catch (Exception e) {
e.printStackTrace();
}
}
}
java 对接腾讯COS实现下载文件
最新推荐文章于 2024-06-03 15:47:01 发布