|
@@ -0,0 +1,295 @@
|
|
|
+package cn.com.ctop.common.module.utils;
|
|
|
+
|
|
|
+import cn.com.ctop.common.module.file.FileType;
|
|
|
+import cn.com.ctop.common.module.file.FileTypeJudge;
|
|
|
+import cn.com.ctop.common.module.vo.ResFileDTO;
|
|
|
+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.exception.CosClientException;
|
|
|
+import com.qcloud.cos.exception.CosServiceException;
|
|
|
+import com.qcloud.cos.model.*;
|
|
|
+import com.qcloud.cos.region.Region;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
+
|
|
|
+import java.io.File;
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.InputStream;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.UUID;
|
|
|
+
|
|
|
+public class CosUtils {
|
|
|
+ private static final String ACCESSKEY = "AKIDE6IpMi8fJQRCg1iuWzFajjRs43kbbets";
|
|
|
+ private static final String SECRETKEY ="tXzuwMfplTTK3c9GFUyETilasvQfePu9";
|
|
|
+ private static final String APPID = "1301855440";
|
|
|
+ private static final String BUCKETNAME = "media-"+APPID;
|
|
|
+ private static final String REGIONID = "ap-chongqing";
|
|
|
+ private static final String URL_PREFIX = "https://"+BUCKETNAME+".cos.ap-chongqing.myqcloud.com/";
|
|
|
+ /**
|
|
|
+ * https://media-1301855440.cos.ap-chongqing.myqcloud.com/MyFile1/1234.mp4
|
|
|
+ */
|
|
|
+ /**
|
|
|
+ * 初始化CosClient相关配置, appid、accessKey、secretKey、region
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static COSClient getCosClient() {
|
|
|
+ // 1 初始化用户身份信息(secretId, secretKey)
|
|
|
+ COSCredentials cred = new BasicCOSCredentials(ACCESSKEY, SECRETKEY);
|
|
|
+ // 2 设置bucket的区域, COS地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
|
|
|
+ // clientConfig中包含了设置region, https(默认http), 超时, 代理等set方法, 使用可参见源码或者接口文档FAQ中说明
|
|
|
+ ClientConfig clientConfig = new ClientConfig(new Region(REGIONID));
|
|
|
+ // 3 生成cos客户端
|
|
|
+ COSClient cosClient = new COSClient(cred, clientConfig);
|
|
|
+ // bucket的命名规则为{name}-{appid} ,此处填写的存储桶名称必须为此格式
|
|
|
+ //String bucketName = BUCKETNAME;
|
|
|
+ return cosClient;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * URL_PREFIX+fileSavePath+fileName
|
|
|
+ * 上传文件
|
|
|
+ * @return
|
|
|
+ * //绝对路径和相对路径都OK
|
|
|
+ */
|
|
|
+ public static String uploadFile(String filePath,String fileSavePath,String fileName) {
|
|
|
+ File localFile = new File(filePath);
|
|
|
+ PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKETNAME, fileSavePath+fileName, localFile);
|
|
|
+ // 设置存储类型, 默认是标准(Standard), 低频(standard_ia),一般为标准的
|
|
|
+ putObjectRequest.setStorageClass(StorageClass.Standard);
|
|
|
+ COSClient cc = getCosClient();
|
|
|
+ try {
|
|
|
+ PutObjectResult putObjectResult = cc.putObject(putObjectRequest);
|
|
|
+ String etag = putObjectResult.getETag();
|
|
|
+ return etag;
|
|
|
+ } catch (CosServiceException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (CosClientException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }finally {
|
|
|
+ // 关闭客户端
|
|
|
+ cc.shutdown();
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 下载文件
|
|
|
+ * @param bucketName
|
|
|
+ * @param key
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String downLoadFile(String bucketName, String key) {
|
|
|
+ File downFile = new File("E:\\software\\1.jpg");
|
|
|
+ COSClient cc = getCosClient();
|
|
|
+ GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
|
|
|
+
|
|
|
+ ObjectMetadata downObjectMeta = cc.getObject(getObjectRequest, downFile);
|
|
|
+ cc.shutdown();
|
|
|
+ String etag = downObjectMeta.getETag();
|
|
|
+ return etag;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除文件
|
|
|
+ * @param bucketName
|
|
|
+ * @param key
|
|
|
+ */
|
|
|
+ public static void deleteFile(String bucketName, String key) {
|
|
|
+ COSClient cc = getCosClient();
|
|
|
+ try {
|
|
|
+ cc.deleteObject(bucketName, key);
|
|
|
+ } catch (CosClientException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } finally {
|
|
|
+ cc.shutdown();
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建桶
|
|
|
+ * @param bucketName
|
|
|
+ * @return
|
|
|
+ * @throws CosClientException
|
|
|
+ * @throws CosServiceException
|
|
|
+ */
|
|
|
+ public static Bucket createBucket(String bucketName) throws CosClientException, CosServiceException {
|
|
|
+ COSClient cc = getCosClient();
|
|
|
+ Bucket bucket = null;
|
|
|
+ try {
|
|
|
+ bucket = cc.createBucket(bucketName);
|
|
|
+ } catch (CosClientException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } finally {
|
|
|
+ }
|
|
|
+ return bucket;
|
|
|
+ };
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除桶
|
|
|
+ * @param bucketName
|
|
|
+ * @throws CosClientException
|
|
|
+ * @throws CosServiceException
|
|
|
+ */
|
|
|
+ public void deleteBucket(String bucketName){
|
|
|
+ COSClient cc = getCosClient();
|
|
|
+ try {
|
|
|
+ cc.deleteBucket(bucketName);
|
|
|
+ } catch (CosClientException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } finally {
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断桶是否存在
|
|
|
+ * @param bucketName
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static boolean doesBucketExist(String bucketName){
|
|
|
+ COSClient cc = getCosClient();
|
|
|
+ return cc.doesBucketExist(bucketName);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查看桶文件
|
|
|
+ * @param bucketName
|
|
|
+ * @return
|
|
|
+ * @throws CosClientException
|
|
|
+ * @throws CosServiceException
|
|
|
+ */
|
|
|
+ public static ObjectListing listObjects(String bucketName) throws CosClientException, CosServiceException {
|
|
|
+ COSClient cc = getCosClient();
|
|
|
+
|
|
|
+ // 获取 bucket 下成员(设置 delimiter)
|
|
|
+ ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
|
|
|
+ listObjectsRequest.setBucketName(bucketName);
|
|
|
+ // 设置 list 的 prefix, 表示 list 出来的文件 key 都是以这个 prefix 开始
|
|
|
+ listObjectsRequest.setPrefix("");
|
|
|
+ // 设置 delimiter 为/, 即获取的是直接成员,不包含目录下的递归子成员
|
|
|
+ listObjectsRequest.setDelimiter("/");
|
|
|
+ // 设置 marker, (marker 由上一次 list 获取到, 或者第一次 list marker 为空)
|
|
|
+ listObjectsRequest.setMarker("");
|
|
|
+ // 设置最多 list 100 个成员,(如果不设置, 默认为 1000 个,最大允许一次 list 1000 个 key)
|
|
|
+ listObjectsRequest.setMaxKeys(100);
|
|
|
+
|
|
|
+ ObjectListing objectListing = cc.listObjects(listObjectsRequest);
|
|
|
+ // 获取下次 list 的 marker
|
|
|
+ String nextMarker = objectListing.getNextMarker();
|
|
|
+ // 判断是否已经 list 完, 如果 list 结束, 则 isTruncated 为 false, 否则为 true
|
|
|
+ boolean isTruncated = objectListing.isTruncated();
|
|
|
+ List<COSObjectSummary> objectSummaries = objectListing.getObjectSummaries();
|
|
|
+ for (COSObjectSummary cosObjectSummary : objectSummaries) {
|
|
|
+ // get file path
|
|
|
+ String key = cosObjectSummary.getKey();
|
|
|
+ // get file length
|
|
|
+ long fileSize = cosObjectSummary.getSize();
|
|
|
+ // get file etag
|
|
|
+ String eTag = cosObjectSummary.getETag();
|
|
|
+ // get last modify time
|
|
|
+ Date lastModified = cosObjectSummary.getLastModified();
|
|
|
+ // get file save type
|
|
|
+ String StorageClassStr = cosObjectSummary.getStorageClass();
|
|
|
+ }
|
|
|
+ return objectListing;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *查询一个 Bucket 所在的 Region。
|
|
|
+ * @param bucketName
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String getBucketLocation(String bucketName){
|
|
|
+ COSClient cosClient = getCosClient();
|
|
|
+ // bucket 的命名规则为{name}-{appid} ,此处填写的存储桶名称必须为此格式
|
|
|
+ return cosClient.getBucketLocation(bucketName);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static ResFileDTO uploadMultipartFile(MultipartFile file,String fileSavePath){
|
|
|
+ String fileName = file.getOriginalFilename();
|
|
|
+ InputStream inputStream;
|
|
|
+ ResFileDTO o = new ResFileDTO();
|
|
|
+ String fileType ;
|
|
|
+ long fileSize = file.getSize();
|
|
|
+ try {
|
|
|
+ inputStream = file.getInputStream();
|
|
|
+ FileType type = FileTypeJudge.getType(inputStream);
|
|
|
+
|
|
|
+ if(type == null || "null".equals(type.toString()) ||
|
|
|
+ "XLS_DOC".equals(type.toString())|| "XLSX_DOCX".equals(type.toString()) ||
|
|
|
+ "WPSUSER".equals(type.toString())|| "WPS".equals(type.toString())){
|
|
|
+ fileType = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
|
|
|
+ }else{
|
|
|
+ fileType = type.toString().toLowerCase();
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ //用户上传的文件类型为空,并且通过二进制流获取不到文件类型,因为二进制流只列举了常用的
|
|
|
+ fileType = "";
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ o = uploadDetailInputStream(file.getInputStream(),fileName,fileType,fileSize,fileSavePath);
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return o;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public static ResFileDTO uploadDetailInputStream (InputStream in, String fileName , String fileType, long fileSize,String fileSavePath) {
|
|
|
+ String uuidFileName = UUID.randomUUID().toString()+fileName.substring(fileName.lastIndexOf("."));
|
|
|
+ String fileUrl = URL_PREFIX+fileSavePath+uuidFileName;
|
|
|
+ String md5key = uploadFileByInputStream(in, fileSavePath, uuidFileName);
|
|
|
+ ResFileDTO o = new ResFileDTO();
|
|
|
+ if(md5key != null){
|
|
|
+ o.setFileType(fileType);
|
|
|
+ o.setFileName(fileName);
|
|
|
+ o.setCFileName(uuidFileName);
|
|
|
+ o.setFileUrl(fileUrl);
|
|
|
+ o.setFileSize(fileSize);
|
|
|
+ o.setMd5key(md5key);
|
|
|
+ }
|
|
|
+ return o;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String uploadFileByInputStream(InputStream fileStream, String fileSavePath, String fileName){
|
|
|
+ ObjectMetadata metadata = new ObjectMetadata();
|
|
|
+ PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKETNAME, fileSavePath+fileName, fileStream,metadata);
|
|
|
+ // 设置存储类型, 默认是标准(Standard), 低频(standard_ia),一般为标准的
|
|
|
+ putObjectRequest.setStorageClass(StorageClass.Standard);
|
|
|
+ COSClient cc = getCosClient();
|
|
|
+ try {
|
|
|
+ PutObjectResult putObjectResult = cc.putObject(putObjectRequest);
|
|
|
+ String etag = putObjectResult.getETag();
|
|
|
+ return etag;
|
|
|
+ } catch (CosServiceException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (CosClientException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }finally {
|
|
|
+ // 关闭客户端
|
|
|
+ cc.shutdown();
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public static void main(String[] args) {
|
|
|
+ String filepath = "D:\\1234.mp4";
|
|
|
+ String fileSavePath = "script-lib/wps/";
|
|
|
+ String fileName = UUID.randomUUID().toString()+filepath.substring(filepath.lastIndexOf("."));
|
|
|
+ String filePath = uploadFile(filepath, fileSavePath, fileName);
|
|
|
+ System.out.println(filePath);
|
|
|
+// downLoadFile(BUCKETNAME , KEY);
|
|
|
+ // deleteFile(BUCKETNAME , KEY01);
|
|
|
+// createBucket("sunjunxian01-1251782781");
|
|
|
+ //deleteBucket();
|
|
|
+// doesBucketExist("sunjunxian01-1251782781");
|
|
|
+// System.out.println(listObjects(BUCKETNAME));
|
|
|
+ //System.out.println("BUCKETNAME的位置:" + getBucketLocation(BUCKETNAME));
|
|
|
+ }
|
|
|
+}
|