package org.yeshi.utils.tencentcloud; import java.io.File; import java.io.IOException; import java.io.InputStream; import org.apache.commons.codec.digest.HmacUtils; import org.apache.commons.lang.ArrayUtils; import org.yeshi.utils.FileUtil; import org.yeshi.utils.StringUtil; import org.yeshi.utils.entity.FileUploadResult; import org.yeshi.utils.tencentcloud.entity.COSInitParams; 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.model.COSObjectSummary; import com.qcloud.cos.model.ListObjectsRequest; import com.qcloud.cos.model.ObjectListing; import com.qcloud.cos.model.ObjectMetadata; import com.qcloud.cos.model.PutObjectRequest; import com.qcloud.cos.model.PutObjectResult; import com.qcloud.cos.region.Region; public class COSManager { static long appId = 0L; static String secretId = ""; static String secretKey = ""; // 设置要操作的bucket static String bucketName = ""; static COSClient cosClient; static String totalBucketName = ""; static COSManager instance; public static COSManager getInstance() { if (instance == null) instance = new COSManager(); return instance; } /** * 初始化,在使用之前必须调用此方法 * * @param params */ public void init(COSInitParams params) { appId = params.getAppId(); secretId = params.getSecretId(); secretKey = params.getSecretKey(); bucketName = params.getBucketName(); COSCredentials cred = new BasicCOSCredentials(secretId, secretKey); ClientConfig clientConfig = new ClientConfig(new Region(params.getRegion())); cosClient = new COSClient(cred, clientConfig); // bucket的命名规则为{name}-{appid} ,此处填写的存储桶名称必须为此格式 totalBucketName = bucketName + "-" + appId; } public FileUploadResult uploadFile(File f, String key) { if (key != null && !key.startsWith("/")) key = "/" + key; PutObjectRequest putObjectRequest = new PutObjectRequest(totalBucketName, key, f); try { PutObjectResult result = cosClient.putObject(putObjectRequest); return new FileUploadResult(String.format("http://%s.file.myqcloud.com%s", totalBucketName, key), result.getETag()); } catch (Exception e) { e.printStackTrace(); } return null; } public FileUploadResult uploadInputStream(InputStream inputStream, String key) { int count = 0; try { count = inputStream.available(); } catch (IOException e1) { e1.printStackTrace(); } ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentLength(count); if (key != null && !key.startsWith("/")) key = "/" + key; PutObjectRequest putObjectRequest = new PutObjectRequest(totalBucketName, key, inputStream, metadata); try { PutObjectResult result = cosClient.putObject(putObjectRequest); return new FileUploadResult(String.format("http://%s.file.myqcloud.com%s", totalBucketName, key), result.getETag()); } catch (Exception e) { e.printStackTrace(); } return null; } public FileUploadResult uploadFile(InputStream inputStream, String key) { if (key != null && !key.startsWith("/")) key = "/" + key; String dir = FileUtil.getCacheDir(); String tempPath = dir + "/temp_" + System.currentTimeMillis() + "_" + (long) (Math.random() * 100000000); try { try { FileUtil.saveAsFile(inputStream, tempPath); } catch (IOException e) { e.printStackTrace(); } if (new File(tempPath).exists()) { return uploadFile(new File(tempPath), key); } return null; } finally { if (new File(tempPath).exists()) new File(tempPath).delete(); } } /** * 获取Object列表 * * @param prefix-匹配字符 * @param count-最大1000 * @param marker-起点标记 * @return */ public ObjectListing getObjectList(String prefix, String marker, int count) { ListObjectsRequest listObjectsRequest = new ListObjectsRequest(); listObjectsRequest.setBucketName(totalBucketName); listObjectsRequest.setDelimiter("/"); listObjectsRequest.setPrefix(prefix); listObjectsRequest.setMaxKeys(count); listObjectsRequest.setMarker(marker); ObjectListing objectListing = cosClient.listObjects(listObjectsRequest); return objectListing; } public COSObjectSummary getObjectDetail(String prefix) { ListObjectsRequest listObjectsRequest = new ListObjectsRequest(); listObjectsRequest.setBucketName(totalBucketName); listObjectsRequest.setDelimiter("/"); listObjectsRequest.setPrefix(prefix); listObjectsRequest.setMaxKeys(1); listObjectsRequest.setMarker(null); ObjectListing objectListing = cosClient.listObjects(listObjectsRequest); if (objectListing.getObjectSummaries() != null && objectListing.getObjectSummaries().size() > 0) { return objectListing.getObjectSummaries().get(0); } return null; } // 文件是否存在 public boolean isFileExist(String url) { String key = url.replace(String.format("https://%s.file.myqcloud.com", totalBucketName), ""); try { cosClient.getObjectMetadata(totalBucketName, key); return true; } catch (Exception e) { } return false; } public boolean deleteFile(String url) { String key = url.replace(String.format("https://%s.file.myqcloud.com", totalBucketName), ""); try { cosClient.deleteObject(totalBucketName, key); return true; } catch (Exception e) { } return false; } public static String getUploadVideoUrl(String name) { if (name != null && !name.startsWith("/")) name = "/" + name; return "https://gz.file.myqcloud.com/files/v2/" + appId + "/" + bucketName + name; } public static String getUploadVideoFileId(String name) { if (name != null && !name.startsWith("/")) name = "/" + name; return "/" + appId + "/" + bucketName + name; } public static String getUploadVideoAuthorization() { long time = System.currentTimeMillis() / 1000; long expireTime = time + 60 * 20;// 20分钟的上传时间 long random = (long) (1000000L * Math.random()); String original = String.format("a=%s&b=%s&k=%s&e=%s&t=%s&r=%s&f=", appId + "", bucketName, secretId, (expireTime) + "", time + "", random + ""); byte[] so = HmacUtils.hmacSha1(secretKey, original); byte[] or = original.getBytes(); byte[] bts = ArrayUtils.addAll(so, or); String sign = StringUtil.getBase64FromByte(bts).replace("\n", "").replace("\r", "").trim(); return sign; } public FileUploadResult uploadFileByte(byte[] b, String key) { if (key != null && !key.startsWith("/")) key = "/" + key; String dir = FileUtil.getCacheDir(); String tempPath = dir + "/temp_" + System.currentTimeMillis() + "_" + (long) (Math.random() * 100000000); try { try { FileUtil.saveAsFileByte(b, tempPath); } catch (IOException e) { e.printStackTrace(); } if (new File(tempPath).exists()) { return uploadFile(new File(tempPath), key); } return null; } finally { if (new File(tempPath).exists()) new File(tempPath).delete(); } } }