"eladmin-system/src/vscode:/vscode.git/clone" did not exist on "9591cf3e53c307d42bc82b866f7b096f19120456"
Unverified Commit cbdfae5b authored by 大森林's avatar 大森林 Committed by Gitee
Browse files

!16 修复 OSS 保存路径问题,以及特殊环境下 OSS 下载到本地会出现 UnknownHost 错误。

Merge pull request !16 from 青木/dev
parents c83e7895 f19f27cd
...@@ -19,6 +19,7 @@ import com.aliyun.oss.OSS; ...@@ -19,6 +19,7 @@ import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.GetObjectRequest; import com.aliyun.oss.model.GetObjectRequest;
import com.jeequan.jeepay.components.oss.config.AliyunOssYmlConfig; import com.jeequan.jeepay.components.oss.config.AliyunOssYmlConfig;
import com.jeequan.jeepay.components.oss.config.OssYmlConfig;
import com.jeequan.jeepay.components.oss.constant.OssSavePlaceEnum; import com.jeequan.jeepay.components.oss.constant.OssSavePlaceEnum;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -30,44 +31,83 @@ import javax.annotation.PostConstruct; ...@@ -30,44 +31,83 @@ import javax.annotation.PostConstruct;
import java.io.File; import java.io.File;
/** /**
* 阿里云OSS 实现类 * 阿里云OSS 实现类
* *
* @author terrfly * @author terrfly
* @site https://www.jeequan.com * @site https://www.jeequan.com
* @date 2021/7/12 18:20 * @date 2021/7/12 18:20
*/ */
@Service @Service
@Slf4j @Slf4j
@ConditionalOnProperty(name = "isys.oss.service-type", havingValue = "aliyun-oss") @ConditionalOnProperty(name = "isys.oss.service-type", havingValue = "aliyun-oss")
public class AliyunOssService implements IOssService{ public class AliyunOssService implements IOssService {
@Autowired
private AliyunOssYmlConfig aliyunOssYmlConfig;
@Autowired private AliyunOssYmlConfig aliyunOssYmlConfig; @Autowired
private OssYmlConfig ossYmlConfig;
// ossClient 初始化 // ossClient 初始化
private OSS ossClient = null; private OSS ossClient = null;
@PostConstruct @PostConstruct
public void init(){ public void init() {
ossClient = new OSSClientBuilder().build(aliyunOssYmlConfig.getEndpoint(), aliyunOssYmlConfig.getAccessKeyId(), aliyunOssYmlConfig.getAccessKeySecret()); ossClient = new OSSClientBuilder().build(aliyunOssYmlConfig.getEndpoint(), aliyunOssYmlConfig.getAccessKeyId(),
aliyunOssYmlConfig.getAccessKeySecret());
}
/**
* 处理文件保存路径
*
* @param ossSavePlaceEnum 保存位置
* @param filePath 文件路径
* @return 完整路径
*/
private String getFileKey(OssSavePlaceEnum ossSavePlaceEnum, String filePath) {
// 上传的时候需要考虑 OSS 存储空间的访问权限,并拼接路径前缀
String filePrefix = ossSavePlaceEnum == OssSavePlaceEnum.PUBLIC ? ossYmlConfig.getOss()
.getFilePublicPath() : ossYmlConfig.getOss().getFilePrivatePath();
// 如果路径包含设置的路径前缀,则跳过
if (filePath.startsWith(filePrefix)) {
// OSS 不允许路径第一个字符为 /
if (filePath.indexOf("/") == 0) {
filePath = filePath.replaceFirst("/", "");
}
return filePath;
}
String fullPath = (filePrefix + "/" + filePath);
// OSS 不允许路径第一个字符为 /
if (fullPath.indexOf("/") == 0) {
fullPath = fullPath.replaceFirst("/", "");
}
return fullPath;
} }
@Override @Override
public String upload2PreviewUrl(OssSavePlaceEnum ossSavePlaceEnum, MultipartFile multipartFile, String saveDirAndFileName) { public String upload2PreviewUrl(OssSavePlaceEnum ossSavePlaceEnum, MultipartFile multipartFile,
String saveDirAndFileName) {
try { try {
this.ossClient.putObject(ossSavePlaceEnum == OssSavePlaceEnum.PUBLIC ? aliyunOssYmlConfig.getPublicBucketName() : aliyunOssYmlConfig.getPrivateBucketName() String fullPath = getFileKey(ossSavePlaceEnum, saveDirAndFileName);
, saveDirAndFileName, multipartFile.getInputStream());
if(ossSavePlaceEnum == OssSavePlaceEnum.PUBLIC){ this.ossClient.putObject(
ossSavePlaceEnum == OssSavePlaceEnum.PUBLIC ? aliyunOssYmlConfig.getPublicBucketName() : aliyunOssYmlConfig.getPrivateBucketName()
, fullPath, multipartFile.getInputStream());
if (ossSavePlaceEnum == OssSavePlaceEnum.PUBLIC) {
// 文档:https://www.alibabacloud.com/help/zh/doc-detail/39607.htm example: https://BucketName.Endpoint/ObjectName // 文档:https://www.alibabacloud.com/help/zh/doc-detail/39607.htm example: https://BucketName.Endpoint/ObjectName
return "https://" + aliyunOssYmlConfig.getPublicBucketName() + "." + aliyunOssYmlConfig.getEndpoint() + "/" + saveDirAndFileName; return "https://" + aliyunOssYmlConfig.getPublicBucketName() + "." + aliyunOssYmlConfig.getEndpoint() + "/" + fullPath;
} }
return saveDirAndFileName; return saveDirAndFileName;
} catch (Exception e) { } catch (Exception e) {
log.error("error", e); log.error("error", e);
return null; return null;
} }
} }
...@@ -76,9 +116,21 @@ public class AliyunOssService implements IOssService{ ...@@ -76,9 +116,21 @@ public class AliyunOssService implements IOssService{
public boolean downloadFile(OssSavePlaceEnum ossSavePlaceEnum, String source, String target) { public boolean downloadFile(OssSavePlaceEnum ossSavePlaceEnum, String source, String target) {
try { try {
String fullPath = getFileKey(ossSavePlaceEnum, source);
File downloadFile = new File(target);
// 当本地路径的上层目录不存在时,自动创建
// OSS SDK 在 Docker 内部可能出现 UnknownHost 错误具体表现为
// com.aliyun.oss.ClientException: Cannot read the content input stream.
if (!downloadFile.getParentFile().exists()) {
log.info("downloadFile parent dir not exists create it: {}",
downloadFile.getParentFile().getAbsolutePath());
downloadFile.getParentFile().mkdirs();
}
String bucket = ossSavePlaceEnum == OssSavePlaceEnum.PRIVATE ? aliyunOssYmlConfig.getPrivateBucketName() : aliyunOssYmlConfig.getPublicBucketName(); String bucket = ossSavePlaceEnum == OssSavePlaceEnum.PRIVATE ? aliyunOssYmlConfig.getPrivateBucketName() : aliyunOssYmlConfig.getPublicBucketName();
this.ossClient.getObject(new GetObjectRequest(bucket, source), new File(target)); this.ossClient.getObject(new GetObjectRequest(bucket, fullPath), downloadFile);
return true; return true;
} catch (Exception e) { } catch (Exception e) {
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment