package cn.com.ty.lift.common.utils; import cn.hutool.core.collection.IterUtil; import cn.hutool.core.util.StrUtil; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.*; import lombok.extern.slf4j.Slf4j; import java.io.*; import java.util.HashMap; import java.util.List; import java.util.Map; /** *

* aliyun OSS工具类 *

* @author wcz * @since 2019/11/29 */ @Slf4j public class AliyunOSS { // Endpoint以杭州为例,其它Region请按实际情况填写。 private String endpoint = "http://oss-cn-beijing.aliyuncs.com"; // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。 private String accessKeyId = "LTAI4FkSqFZa6LH9HqAsVott"; private String accessKeySecret = "w7GXuh5tf1hduQuZ2AzT3a4q14BI1i"; //存储空间名 private String bucketName = "temp15827479607"; //OSSClient实例 private OSS ossClient; /** * 无参构造,初始化oss */ private AliyunOSS() { hint("Default"); init(); } /** * 全参构造方法 * * @param endpoint * @param accessKeyId * @param accessKeySecret * @param bucketName */ private AliyunOSS(String endpoint, String accessKeyId, String accessKeySecret, String bucketName) { this.endpoint = endpoint; this.accessKeyId = accessKeyId; this.accessKeySecret = accessKeySecret; this.bucketName = bucketName; hint("Custom"); init(); } private void hint(String type){ log.info("Hint: Using the {} Configuration To Create Aliyun OSS Client.",type); } /** * 初始化,创建OSSClient实例 */ private void init() { if (null == ossClient) { ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); } } /** * 关闭OSSClient。 */ private void destroy() { if (null != ossClient) { ossClient.shutdown(); } } /** * 设置bucketName * * @param bucketName */ public void setBucketName(String bucketName) { this.bucketName = bucketName; } /** * static 无参构造方法 * * @return */ public static AliyunOSS me() { return new AliyunOSS(); } /** * static 全参构造方法 * * @param endpoint * @param accessKeyId * @param accessKeySecret * @param bucketName * @return */ public static AliyunOSS me(String endpoint, String accessKeyId, String accessKeySecret, String bucketName) { return new AliyunOSS(endpoint, accessKeyId, accessKeySecret, bucketName); } /** * @param * @return * @description 创建存储空间 * 存储空间是OSS全局命名空间,相当于数据的容器,可以存储若干文件。 以下代码用于新建一个存储空间 * @date 2019/11/29 10:30 */ public boolean createBucket(String bucketName) { if (StrUtil.isEmpty(bucketName)) { return false; } try { ossClient.createBucket(bucketName); return true; } catch (Exception e) { log.error("创建存储空间异常: {}", e); return false; } finally { destroy(); } } /** * @param objectName 上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。 * @return * @description 上传文件,上传文件至OSS * @date 2019/11/29 10:31 */ public String putObject(String bucketName, String objectName, byte[] content) { try { // 上传内容到指定的存储空间(bucketName)并保存为指定的文件名称(objectName)。 ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content)); String url = getObjectUrl(bucketName, objectName); return url; } catch (Exception e) { log.error("上传文件异常: {}", e); return null; } finally { destroy(); } } /** * 批量上传文件到oss,返回 key:objectName ,value:url * * @param bucketName * @param ossEntities * @return */ public Map putObjects(String bucketName, List ossEntities) { try { if (IterUtil.isEmpty(ossEntities)) { return null; } Map urls = new HashMap<>(); ossEntities.forEach(entity -> { // 上传内容到指定的存储空间(bucketName)并保存为指定的文件名称(objectName)。 String objectName = entity.getObjectName(); ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(entity.getContent())); String url = getObjectUrl(bucketName, objectName); log.info("objectName: {}, url: {}", objectName, url); urls.put(objectName, url); }); return urls; } catch (Exception e) { log.error("上传文件异常: {}", e); return null; } finally { destroy(); } } public String putObject(String objectName, byte[] content) { if (StrUtil.isEmpty(objectName)) { return null; } return putObject(bucketName, objectName, content); } /** * @param * @return * @description 下载文件,获取文件的文本内容 * @date 2019/11/29 10:32 */ public boolean getObject(String bucketName, String objectName) throws Exception { try { // 调用ossClient.getObject返回一个OSSObject实例,该实例包含文件内容及文件元信息。 OSSObject ossObject = ossClient.getObject(bucketName, objectName); // 调用ossObject.getObjectContent获取文件输入流,可读取此输入流获取其内容。 InputStream content = ossObject.getObjectContent(); if (content != null) { BufferedReader reader = new BufferedReader(new InputStreamReader(content)); while (true) { String line = reader.readLine(); if (line == null) break; System.out.println("\n" + line); } // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。 content.close(); } return true; }catch (Exception e){ log.error("获取文件异常:{}",e); return false; }finally { destroy(); } } /** * @param * @return * @description 列举文件:列举指定存储空间下的文件。默认列举100个文件 * @date 2019/11/29 10:38 */ public void listObjects(String bucketName) { // ossClient.listObjects返回ObjectListing实例,包含此次listObject请求的返回结果。 ObjectListing objectListing = ossClient.listObjects(bucketName); // objectListing.getObjectSummaries获取所有文件的描述信息。 for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) { System.out.println(" - " + objectSummary.getKey() + " " + "(size = " + objectSummary.getSize() + ")"); } // 关闭OSSClient。 destroy(); } /** * @param * @return * @description 删除文件 * @date 2019/11/29 10:44 */ public boolean deleteObject(String bucketName, String objectName) { // 表示删除OSS文件时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。 try { // 删除文件。 ossClient.deleteObject(bucketName, objectName); return true; } catch (Exception e) { log.error("删除文件异常: {}", e); return false; } finally { destroy(); } } public boolean deleteObject(String objectName) { if (StrUtil.isEmpty(objectName)) { return false; } return deleteObject(bucketName, objectName); } public boolean putFile(String bucketName, String objectName, File file) { try { // 创建PutObjectRequest对象。 PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, file); // 如果需要上传时设置存储类型与访问权限,请参考以下示例代码。 // ObjectMetadata metadata = new ObjectMetadata(); // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString()); // metadata.setObjectAcl(CannedAccessControlList.Private); // putObjectRequest.setMetadata(metadata); // 上传文件。 ossClient.putObject(putObjectRequest); return true; } catch (Exception e) { log.error("上传文件异常: {}", e); return false; } finally { destroy(); } } public boolean putFile(String objectName, File file) { if (StrUtil.isEmpty(objectName)) { return false; } return putFile(bucketName, objectName, file); } public File getFile(String bucketName, String objectName, File file) { try { // 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。 ossClient.getObject(new GetObjectRequest(bucketName, objectName), file); return file; } catch (Exception e) { log.error("获取文件异常: {}", e); return null; } finally { destroy(); } } public String getObjectUrl(String bucketName, String objectName) { if(StrUtil.hasEmpty(endpoint,objectName)){ return null; } return endpoint.replace("//","//" + bucketName + ".") + "/" + objectName; } }