package com.zy.sc.common.service; import com.aliyun.oss.OSSClient; import com.aliyun.oss.model.OSSObject; import com.aliyun.oss.model.ObjectMetadata; import com.core.common.SnowflakeIdWorker; import com.core.exception.CoolException; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.InputStream; import java.net.URL; import java.security.SecureRandom; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Objects; /** * 阿里云OSS服务类 * Created by vincent on 2019-11-26 */ @Data @Slf4j @Service("ossService") public class OssService { private static final String OSS_ENDPOINT = "http://oss-cn-hangzhou.aliyuncs.com"; @Value("${aliyun.oss.id}") private String accessKeyId; @Value("${aliyun.oss.secret}") private String accessKeySecret; @Value("${aliyun.oss.bucket}") private String bucket; @Value("${aliyun.oss.endpoint}") private String endpoint; @Value("${aliyun.oss.prefix}") private String prefix; @Autowired private SnowflakeIdWorker snowflakeIdWorker; /** * 上传OSS文件 * @return the url */ public String upload(InputStream inputStream, String fileName){ OSSClient ossClient = new OSSClient(OSS_ENDPOINT, accessKeyId, accessKeySecret); try { if (!ossClient.doesBucketExist(bucket)) { ossClient.createBucket(bucket); log.info("您的Bucket不存在,创建Bucket:{}",bucket); } String suffix = Objects.requireNonNull(fileName).substring(fileName.lastIndexOf(".") + 1); String name = String.valueOf(snowflakeIdWorker.nextId()).concat(".").concat(suffix); ObjectMetadata objectMetadata = new ObjectMetadata(); ossClient.putObject(bucket, name, inputStream, objectMetadata); Date expiration = new Date(new Date().getTime() + 3600L * 1000 * 24 * 365 * 100); URL url = ossClient.generatePresignedUrl(bucket, name, expiration); log.info("OSS文件上传成功: {}", name); // return String.valueOf(url); return prefix+name; } catch (Exception e){ log.error("OSS文件上传失败!文件名{}", fileName); e.printStackTrace(); } finally { ossClient.shutdown(); } throw new CoolException("500-上传失败"); } /** * 下载OSS文件 */ public void download(String name) { OSSClient ossClient = new OSSClient(OSS_ENDPOINT, accessKeyId, accessKeySecret); try { OSSObject ossObject = ossClient.getObject(bucket, name); InputStream inputStream = ossObject.getObjectContent(); // do transfer inputStream.close(); log.info("OSS文件下载成功: {}", name); } catch (Exception e){ e.printStackTrace(); } finally { ossClient.shutdown(); } } /** * 删除OSS文件 */ public boolean delete(String name) { OSSClient ossClient = new OSSClient(OSS_ENDPOINT, accessKeyId, accessKeySecret); try { ossClient.deleteObject(bucket, name); } catch (Exception e){ e.printStackTrace(); return false; } finally { ossClient.shutdown(); } return true; } public String uploadFile(InputStream inputStream, String fileName, Long len, String suffix){ OSSClient ossClient = new OSSClient(OSS_ENDPOINT, accessKeyId, accessKeySecret); try { if (!ossClient.doesBucketExist(bucket)) { ossClient.createBucket(bucket); log.info("您的Bucket不存在,创建Bucket:{}", bucket); } SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); // 生成上传文件名 String finalFileName = System.currentTimeMillis() + "" + new SecureRandom().nextInt(0x0400) + "." + suffix; String objectName = sdf.format(new Date()) + "/" + finalFileName; // 添加 ContentType ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setContentLength(len); ossClient.putObject(bucket, objectName, inputStream, objectMetadata); // 设置URL过期时间为100年。 Date expiration = new Date(new Date().getTime() + 3600L * 1000 * 24 * 365 * 100); // 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。 URL url = ossClient.generatePresignedUrl(bucket, objectName, expiration); log.info("OSS文件上传成功: {}", fileName); // return String.valueOf(url); return prefix + objectName; } catch (Exception e){ e.printStackTrace(); } finally { ossClient.shutdown(); } throw new CoolException("500-上传失败"); } }