From 4165ca4ff1e5df0c173349d1b16061791ad42603 Mon Sep 17 00:00:00 2001 From: Afly Date: Tue, 3 Jan 2023 17:21:17 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20perf:=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=86=99=E6=96=87=E4=BB=B6=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin.xml | 3 +- .../repository/core/S3ResourceRepository.java | 91 +++++++++++++------ 2 files changed, 63 insertions(+), 31 deletions(-) diff --git a/plugin.xml b/plugin.xml index 29af249..b9c5b3f 100644 --- a/plugin.xml +++ b/plugin.xml @@ -5,12 +5,13 @@ com.fanruan.fs yes no - 1.3.5 + 1.3.6 10.0~10.0 2021-03-11 richie [2022-09-22]第三方组件升级。
[2022-07-25]修复http无法连接,而https和缺省的时候正常
[2022-06-30]新增enablePathStyleAccess、signerOverride后台配置
diff --git a/src/main/java/com/fanruan/fs/s3/repository/core/S3ResourceRepository.java b/src/main/java/com/fanruan/fs/s3/repository/core/S3ResourceRepository.java index a99b34a..ae4833a 100644 --- a/src/main/java/com/fanruan/fs/s3/repository/core/S3ResourceRepository.java +++ b/src/main/java/com/fanruan/fs/s3/repository/core/S3ResourceRepository.java @@ -119,17 +119,6 @@ public class S3ResourceRepository extends BaseResourceRepository { @Override public void write(String path, byte[] data) { - - List paths = getAllNecessaryPath(path); - for (int i = paths.size() - 1; i > 0; i--) { - String parent = paths.get(i); - PutObjectRequest req = new PutObjectRequest(bucket, parent, new ByteArrayInputStream(new byte[0]), buildEmptyMetadata()); - try { - s3.putObject(req); - } catch (Exception e) { - LogKit.error("[S3] Failed to create parent path {}", parent); - } - } ObjectMetadata metadata; try { metadata = s3.getObjectMetadata(bucket, path); @@ -150,16 +139,16 @@ public class S3ResourceRepository extends BaseResourceRepository { @Override public boolean createFile(String path) { - List paths = getAllNecessaryPath(path); - for (int i = paths.size() - 1; i >= 0; i--) { - String parent = paths.get(i); - PutObjectRequest req = new PutObjectRequest(bucket, parent, new ByteArrayInputStream(new byte[0]), buildEmptyMetadata()); - try { - s3.putObject(req); - } catch (Exception e) { - LogKit.error("[S3] Failed to create parent path {}", parent); - return false; - } + String parent = path.substring(0, path.lastIndexOf(DELIMITER) + 1); + if (!dirExist(parent)) { + createDirectory(parent); + } + PutObjectRequest req = new PutObjectRequest(bucket, path, new ByteArrayInputStream(new byte[0]), buildEmptyMetadata()); + try { + s3.putObject(req); + } catch (Exception e) { + LogKit.error("[S3] Failed to create file path {}", path); + return false; } return true; } @@ -170,17 +159,23 @@ public class S3ResourceRepository extends BaseResourceRepository { if (!path.endsWith(DELIMITER)) { path += DELIMITER; } - List paths = getAllNecessaryPath(path); - for (int i = paths.size() - 1; i >= 0; i--) { - String parent = paths.get(i); - PutObjectRequest req = new PutObjectRequest(bucket, parent, new ByteArrayInputStream(new byte[0]), buildEmptyMetadata()); - try { - s3.putObject(req); - } catch (Exception e) { - LogKit.error("[S3] Failed to create parent path {}", parent); + String temp = path.substring(0, path.length() - 1); + String parent = temp.substring(0, temp.lastIndexOf(DELIMITER) + 1); + if (StringUtils.isEmpty(parent)) { + return true; + } + if (!dirExist(parent)) { + if (!createDirectory(parent)) { return false; } } + PutObjectRequest req = new PutObjectRequest(bucket, path, new ByteArrayInputStream(new byte[0]), buildEmptyMetadata()); + try { + s3.putObject(req); + } catch (Exception e) { + LogKit.error("[S3] Failed to create parent path {}", path); + return false; + } return true; } @@ -214,13 +209,49 @@ public class S3ResourceRepository extends BaseResourceRepository { @Override public boolean exist(String path) { + return fileExist(path) || (!path.endsWith(DELIMITER) && dirExist(path)) || isParentPathAbsent(path); + } + + private boolean fileExist(String path) { try { - return s3.doesObjectExist(bucket, path) || s3.doesObjectExist(bucket, path + DELIMITER); + return s3.doesObjectExist(bucket, path); } catch (Exception e) { return false; } } + private boolean dirExist(String path) { + if (StringUtils.equals(path, DELIMITER)) { + return true; + } + if (!path.endsWith(DELIMITER)) { + path += DELIMITER; + } + return fileExist(path); + } + + /** + * 如果存在文件创建了,但是其父目录没有创建的场景,为其递归创建对象,返回创建结果 + */ + private boolean isParentPathAbsent(String path) { + if (path.startsWith(DELIMITER)) { + path = path.substring(1); + } + if (path.endsWith(DELIMITER)) { + path = path.substring(0, path.length() - 1); + } + ObjectListing objectListing = s3.listObjects( + new ListObjectsRequest() + .withBucketName(bucket) + .withPrefix(path)); + for (S3ObjectSummary summary : objectListing.getObjectSummaries()) { + if (summary.getKey().startsWith(path + DELIMITER)) { + return createDirectory(path); + } + } + return false; + } + @Override public String[] list(String dir, final Filter filter) { List result = new ArrayList<>(); From df2938534351c1ef9b626564ee978e1178c4f819 Mon Sep 17 00:00:00 2001 From: Afly Date: Tue, 10 Jan 2023 14:19:25 +0800 Subject: [PATCH 2/3] =?UTF-8?q?REPORT-88094=20fix:=20=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E8=BE=83=E5=A4=9A=E6=97=B6=EF=BC=8ClistEntry?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E4=B8=8D=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fs/s3/repository/core/S3ResourceRepository.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/fanruan/fs/s3/repository/core/S3ResourceRepository.java b/src/main/java/com/fanruan/fs/s3/repository/core/S3ResourceRepository.java index ae4833a..66f907e 100644 --- a/src/main/java/com/fanruan/fs/s3/repository/core/S3ResourceRepository.java +++ b/src/main/java/com/fanruan/fs/s3/repository/core/S3ResourceRepository.java @@ -87,6 +87,15 @@ public class S3ResourceRepository extends BaseResourceRepository { ListObjectsRequest listObjectsRequest = new ListObjectsRequest().withBucketName(bucket) .withPrefix(dir).withDelimiter(DELIMITER); ObjectListing objectListing = s3.listObjects(listObjectsRequest); + collectFileEntry(result, objectListing); + while (objectListing.isTruncated()) { + objectListing = s3.listNextBatchOfObjects(objectListing); + collectFileEntry(result, objectListing); + } + return result.toArray(new FineFileEntry[0]); + } + + private void collectFileEntry(List result, ObjectListing objectListing) { for (S3ObjectSummary summary : objectListing.getObjectSummaries()) { String key = summary.getKey(); if (!key.endsWith(DELIMITER)) { @@ -98,8 +107,6 @@ public class S3ResourceRepository extends BaseResourceRepository { entry.setDirectory(true); result.add(entry); } - - return result.toArray(new FineFileEntry[0]); } @Override From 255207d5ba7a227a308726452fc28ceb957f60e1 Mon Sep 17 00:00:00 2001 From: Afly Date: Tue, 10 Jan 2023 14:26:27 +0800 Subject: [PATCH 3/3] REPORT-88094 fix: change-notes --- plugin.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin.xml b/plugin.xml index b9c5b3f..20e7f27 100644 --- a/plugin.xml +++ b/plugin.xml @@ -11,7 +11,7 @@ richie + [2023-01-03]优化写文件性能; 修复文件太多显示不全的问题。
[2022-09-22]第三方组件升级。
[2022-07-25]修复http无法连接,而https和缺省的时候正常
[2022-06-30]新增enablePathStyleAccess、signerOverride后台配置