Compare commits

...

10 Commits

Author SHA1 Message Date
Seth.Tian 638f5cab3f Pull request #19: QFX-5192 回退,改为修改metadata的length 4 years ago
Seth.Tian 6ca4a6a943 Merge remote-tracking branch 'origin/master' 4 years ago
Seth.Tian 7317ba5d24 QFX-5192 update:写入的方法回退,改为修改metadata的length 4 years ago
Seth.Tian 5793a02da6 Pull request #18: QFX-5192 update:更新版本号,修复一个key存在但是length不一样时会导致写入文件不对的问题 4 years ago
Seth.Tian 42110ac049 QFX-5192 update:更新版本号,修复一个key存在但是length不一样时会导致写入失败的问题 4 years ago
richie ff1ca0bc3c 应该在父依赖下申明 4 years ago
ju|剧浩宇 07283b3bf3 Pull request #13: 无jira任务 更新依赖以及版本号 4 years ago
Seth.Tian b471687529 无jira任务 update:更新依赖以及版本号 4 years ago
Echen 5a5ffed822 Pull request #7: QFX-3714 S3插件 copy重写 4 years ago
Seth.Tian 2d967fa5fe QFX-3714 update:重写s3的copy方法 4 years ago
  1. 1
      build.gradle
  2. 3
      plugin.xml
  3. 30
      src/main/java/com/fanruan/fs/s3/repository/core/S3RepositoryFactory.java
  4. 37
      src/main/java/com/fanruan/fs/s3/repository/core/S3ResourceRepository.java

1
build.gradle

@ -1,4 +1,3 @@
apply plugin: 'java'

3
plugin.xml

@ -5,12 +5,13 @@
<main-package>com.fanruan.fs</main-package>
<active>yes</active>
<hidden>no</hidden>
<version>1.2.2</version>
<version>2.2</version>
<env-version>10.0</env-version>
<jartime>2020-01-27</jartime>
<vendor>richie</vendor>
<description><![CDATA[使用支持S3协议的云存储文件系统作为文件服务器。]]></description>
<change-notes><![CDATA[
[2021-01-11]重写copy实现。<br/>
[2020-12-16]修复远程设计新增、修改模板问题。<br/>
[2020-10-29]修复连接不释放问题。<br/>
[2020-08-17]修复key不存在时报错的问题。<br/>

30
src/main/java/com/fanruan/fs/s3/repository/core/S3RepositoryFactory.java

@ -5,10 +5,15 @@ import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectInputStream;
import com.fanruan.api.log.LogKit;
import com.fr.io.base.provider.impl.ConfigRepositoryFactory;
import com.fr.io.context.info.RepositoryProfile;
import com.fr.io.repository.ResourceRepository;
import com.fr.stable.AssistUtils;
import java.io.IOException;
/**
* @author richie
@ -18,6 +23,8 @@ import com.fr.io.repository.ResourceRepository;
public class S3RepositoryFactory extends ConfigRepositoryFactory<S3Config> {
static final String IDENTITY = "S3";
private static final String TEST_KEY = "test_key";
private static final String TEST_CONTENT = "test content";
public S3RepositoryFactory() {
super(IDENTITY);
@ -40,16 +47,35 @@ public class S3RepositoryFactory extends ConfigRepositoryFactory<S3Config> {
AmazonS3 s3 = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(config.getEndPoint(), config.getRegion()))
.withCredentials(new AWSStaticCredentialsProvider(credentials)).build();
s3.listObjects(config.getBucket());
// listObjects方法存在问题,如果key中包含URL编码的内容,将会抛异常,修改为读写验证是否可用
s3.putObject(config.getBucket(), TEST_KEY, TEST_CONTENT);
try (S3Object object = s3.getObject(config.getBucket(), TEST_KEY)) {
final String content = getContent(object);
s3.deleteObject(config.getBucket(), TEST_KEY);
return AssistUtils.equals(TEST_CONTENT, content);
}
} catch (Exception e) {
LogKit.error(e.getMessage(), e);
return false;
}
return true;
}
@Override
public ResourceRepository produce(String repoName, String workRoot, S3Config config) {
return new S3ResourceRepository(repoName, workRoot, config);
}
private String getContent(S3Object object) {
final StringBuilder stringBuilder = new StringBuilder();
try (S3ObjectInputStream objectContent = object.getObjectContent()) {
final byte[] bytes = new byte[4096];
int i = 0;
while ((i = objectContent.read(bytes)) > -1) {
stringBuilder.append(new String(bytes, 0, i));
}
} catch (IOException e) {
LogKit.error(e.getMessage(), e);
}
return stringBuilder.toString();
}
}

37
src/main/java/com/fanruan/fs/s3/repository/core/S3ResourceRepository.java

@ -16,9 +16,13 @@ import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectSummary;
import com.fanruan.api.log.LogKit;
import com.fanruan.api.util.StringKit;
import com.fr.common.util.Strings;
import com.fr.io.repository.FineFileEntry;
import com.fr.io.repository.base.BaseResourceRepository;
import com.fr.stable.ArrayUtils;
import com.fr.stable.AssistUtils;
import com.fr.stable.Filter;
import com.fr.stable.StableUtils;
import com.fr.workspace.resource.ResourceIOException;
import java.io.ByteArrayInputStream;
@ -36,6 +40,7 @@ import java.util.List;
public class S3ResourceRepository extends BaseResourceRepository {
private static final String DELIMITER = "/";
private static final String CHAR_SET = "UTF-8";
private final AmazonS3 s3;
private final String bucket;
@ -96,6 +101,35 @@ public class S3ResourceRepository extends BaseResourceRepository {
return result.toArray(new FineFileEntry[0]);
}
@Override
public boolean copy(String source, String target) throws ResourceIOException {
if (AssistUtils.equals(source, target)
|| Strings.isEmpty(source)
|| Strings.isEmpty(target)) {
return true;
}
boolean result = true;
if (this.isDirectory(source)) {
final String[] list = list(source);
if (!ArrayUtils.isEmpty(list)) {
for (String s : list) {
String targetKey = StableUtils.pathJoin(target, s);
String sourceKey = StableUtils.pathJoin(source, s);
result = result && this.copy(sourceKey, targetKey);
}
}
} else {
try {
s3.copyObject(bucket, source, bucket, target);
return true;
} catch (Exception e) {
LogKit.error(e, "copy {} to {} failed, because : ", source, target, e.getMessage());
return false;
}
}
return result;
}
private FineFileEntry s3Object2FileEntry(S3ObjectSummary s3Object, String path) {
FineFileEntry entry = new FineFileEntry(path);
entry.setDirectory(s3Object.getKey().endsWith("/"));
@ -140,6 +174,9 @@ public class S3ResourceRepository extends BaseResourceRepository {
}
metadata.setContentLength(data.length);
}
if (metadata != null) {
metadata.setContentLength(data.length);
}
s3.putObject(bucket, path, new ByteArrayInputStream(data), metadata);
}

Loading…
Cancel
Save