package com.qianwen.core.oss;
|
|
import com.aliyun.oss.OSSClient;
|
import com.aliyun.oss.common.utils.BinaryUtil;
|
import com.aliyun.oss.model.GetObjectRequest;
|
import com.aliyun.oss.model.MatchMode;
|
import com.aliyun.oss.model.OSSObject;
|
import com.aliyun.oss.model.ObjectMetadata;
|
import com.aliyun.oss.model.PolicyConditions;
|
import com.aliyun.oss.model.PutObjectResult;
|
import java.io.InputStream;
|
import java.math.BigDecimal;
|
import java.nio.charset.StandardCharsets;
|
import java.util.Date;
|
import java.util.LinkedHashMap;
|
import java.util.List;
|
import java.util.Map;
|
import com.qianwen.core.oss.model.BladeFile;
|
import com.qianwen.core.oss.model.OssFile;
|
import com.qianwen.core.oss.props.OssProperties;
|
import com.qianwen.core.oss.rule.OssRule;
|
import com.qianwen.core.tool.jackson.JsonUtil;
|
import org.springframework.util.StringUtils;
|
import org.springframework.web.multipart.MultipartFile;
|
|
public class AliossTemplate implements OssTemplate {
|
private final OSSClient ossClient;
|
private final OssProperties ossProperties;
|
private final OssRule ossRule;
|
|
public AliossTemplate(final OSSClient ossClient, final OssProperties ossProperties, final OssRule ossRule) {
|
this.ossClient = ossClient;
|
this.ossProperties = ossProperties;
|
this.ossRule = ossRule;
|
}
|
|
@Override
|
public void makeBucket(String bucketName) {
|
if (!bucketExists(bucketName)) {
|
this.ossClient.createBucket(getBucketName(bucketName));
|
}
|
}
|
|
@Override
|
public void removeBucket(String bucketName) {
|
this.ossClient.deleteBucket(getBucketName(bucketName));
|
}
|
|
@Override
|
public boolean bucketExists(String bucketName) {
|
return this.ossClient.doesBucketExist(getBucketName(bucketName));
|
}
|
|
@Override
|
public void copyFile(String bucketName, String fileName, String destBucketName) {
|
this.ossClient.copyObject(getBucketName(bucketName), fileName, getBucketName(destBucketName), fileName);
|
}
|
|
@Override
|
public void copyFile(String bucketName, String fileName, String destBucketName, String destFileName) {
|
this.ossClient.copyObject(getBucketName(bucketName), fileName, getBucketName(destBucketName), destFileName);
|
}
|
|
@Override
|
public OssFile statFile(String fileName) {
|
return statFile(this.ossProperties.getBucketName(), fileName);
|
}
|
|
@Override
|
public OssFile statFile(String bucketName, String fileName) {
|
ObjectMetadata stat = this.ossClient.getObjectMetadata(getBucketName(bucketName), fileName);
|
OssFile ossFile = new OssFile();
|
ossFile.setName(fileName);
|
ossFile.setLink(fileLink(ossFile.getName()));
|
ossFile.setHash(stat.getContentMD5());
|
ossFile.setLength(stat.getContentLength());
|
ossFile.setPutTime(stat.getLastModified());
|
ossFile.setContentType(stat.getContentType());
|
return ossFile;
|
}
|
|
@Override
|
public String filePath(String fileName) {
|
return getOssHost().concat("/").concat(fileName);
|
}
|
|
@Override
|
public String filePath(String bucketName, String fileName) {
|
return getOssHost(bucketName).concat("/").concat(fileName);
|
}
|
|
@Override
|
public String fileLink(String fileName) {
|
return getOssHost().concat("/").concat(fileName);
|
}
|
|
@Override
|
public String fileLink(String bucketName, String fileName) {
|
return getOssHost(bucketName).concat("/").concat(fileName);
|
}
|
|
@Override
|
public InputStream getObject(String bucketName, String fileName, Long offset, Long length) {
|
return get(bucketName, fileName, offset, length);
|
}
|
|
@Override
|
public InputStream getObject(String fileName, Long offset, Long length) {
|
return get(this.ossProperties.getBucketName(), fileName, offset, length);
|
}
|
|
@Override
|
public InputStream getObject(String bucketName, String fileName) {
|
return get(bucketName, fileName);
|
}
|
|
@Override
|
public InputStream getObject(String fileName) {
|
return get(this.ossProperties.getBucketName(), fileName);
|
}
|
|
@Override
|
public BladeFile putFile(MultipartFile file) {
|
return putFile(this.ossProperties.getBucketName(), file.getOriginalFilename(), file);
|
}
|
|
@Override
|
public BladeFile putFile(String fileName, MultipartFile file) {
|
return putFile(this.ossProperties.getBucketName(), fileName, file);
|
}
|
|
@Override
|
public BladeFile putFile(String bucketName, String fileName, MultipartFile file) {
|
try {
|
return putFile(bucketName, fileName, file.getInputStream());
|
} catch (Exception ex) {
|
throw new RuntimeException(ex);
|
}
|
}
|
|
@Override
|
public BladeFile putFile(String fileName, InputStream stream) {
|
return putFile(this.ossProperties.getBucketName(), fileName, stream);
|
}
|
|
@Override
|
public BladeFile putFile(String bucketName, String fileName, InputStream stream) {
|
return put(bucketName, stream, fileName, false);
|
}
|
|
public BladeFile put(String bucketName, InputStream stream, String key, boolean cover) {
|
makeBucket(bucketName);
|
String key2 = getFileName(key);
|
if (cover) {
|
this.ossClient.putObject(getBucketName(bucketName), key2, stream);
|
} else {
|
PutObjectResult response = this.ossClient.putObject(getBucketName(bucketName), key2, stream);
|
for (int retry = 0; StringUtils.isEmpty(response.getETag()) && retry < 5; retry++) {
|
response = this.ossClient.putObject(getBucketName(bucketName), key2, stream);
|
}
|
}
|
BladeFile file = new BladeFile();
|
file.setOriginalName(key);
|
file.setName(key2);
|
file.setDomain(getOssHost(bucketName));
|
file.setLink(fileLink(bucketName, key2));
|
return file;
|
}
|
|
public InputStream get(String bucketName, String key) {
|
OSSObject ossObject = this.ossClient.getObject(getBucketName(bucketName), key);
|
return ossObject.getObjectContent();
|
}
|
|
public InputStream get(String bucketName, String key, Long offset, Long length) {
|
GetObjectRequest getObjectRequest = new GetObjectRequest(getBucketName(bucketName), key);
|
getObjectRequest.setRange(offset.longValue(), new BigDecimal(offset.longValue()).add(new BigDecimal(length.longValue())).longValue());
|
OSSObject ossObject = this.ossClient.getObject(getObjectRequest);
|
return ossObject.getObjectContent();
|
}
|
|
@Override
|
public void removeFile(String fileName) {
|
this.ossClient.deleteObject(getBucketName(), fileName);
|
}
|
|
@Override
|
public void removeFile(String bucketName, String fileName) {
|
this.ossClient.deleteObject(getBucketName(bucketName), fileName);
|
}
|
|
@Override
|
public void removeFiles(List<String> fileNames) {
|
fileNames.forEach(this::removeFile);
|
}
|
|
@Override
|
public void removeFiles(String bucketName, List<String> fileNames) {
|
fileNames.forEach(fileName -> {
|
removeFile(getBucketName(bucketName), fileName);
|
});
|
}
|
|
private String getBucketName() {
|
return getBucketName(this.ossProperties.getBucketName());
|
}
|
|
private String getBucketName(String bucketName) {
|
return this.ossRule.bucketName(bucketName);
|
}
|
|
private String getFileName(String originalFilename) {
|
return this.ossRule.fileName(originalFilename);
|
}
|
|
public String getUploadToken() {
|
return getUploadToken(this.ossProperties.getBucketName());
|
}
|
|
public String getUploadToken(String bucketName) {
|
return getUploadToken(bucketName, ((Long) this.ossProperties.getArgs().get("expireTime", 3600L)).longValue());
|
}
|
|
public String getUploadToken(String bucketName, long expireTime) {
|
long expireEndTime = System.currentTimeMillis() + (expireTime * 1000);
|
Date expiration = new Date(expireEndTime);
|
PolicyConditions policyConds = new PolicyConditions();
|
policyConds.addConditionItem("content-length-range", 0L, ((Integer) this.ossProperties.getArgs().get("contentLengthRange", 10485760)).intValue());
|
policyConds.addConditionItem(MatchMode.StartWith, "key", "upload");
|
String postPolicy = this.ossClient.generatePostPolicy(expiration, policyConds);
|
byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8);
|
String encodedPolicy = BinaryUtil.toBase64String(binaryData);
|
String postSignature = this.ossClient.calculatePostSignature(postPolicy);
|
Map<String, String> respMap = new LinkedHashMap<>(16);
|
respMap.put("accessid", this.ossProperties.getAccessKey());
|
respMap.put("policy", encodedPolicy);
|
respMap.put("signature", postSignature);
|
respMap.put("dir", "upload");
|
respMap.put("host", getOssHost(bucketName));
|
respMap.put("expire", String.valueOf(expireEndTime / 1000));
|
return JsonUtil.toJson(respMap);
|
}
|
|
public String getOssHost(String bucketName) {
|
String prefix = this.ossProperties.getEndpoint().contains("https://") ? "https://" : "http://";
|
return prefix + getBucketName(bucketName) + "." + this.ossProperties.getEndpoint().replaceFirst(prefix, "");
|
}
|
|
public String getOssHost() {
|
return getOssHost(this.ossProperties.getBucketName());
|
}
|
}
|