Skip to content

Commit 0308af9

Browse files
committed
feat(s3): s3client(), file_exists() methods
1 parent fe0cf2a commit 0308af9

File tree

1 file changed

+34
-6
lines changed

1 file changed

+34
-6
lines changed

utils/storage/S3Storage.py

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import boto3
2+
import botocore
23
import re
34
import os
45
import time
@@ -45,13 +46,14 @@ def __init__(self, url, path=""):
4546
self.bucket_name = s3_dest["bucket"]
4647
self.path = s3_dest["path"]
4748

48-
self._s3 = None
49+
self._s3resource = None
50+
self._s3client = None
4951
self._bucket = None
5052
print("self.endpoint_url", self.endpoint_url)
5153

52-
def s3(self):
53-
if self._s3:
54-
return self._s3
54+
def s3resource(self):
55+
if self._s3resource:
56+
return self._s3resource
5557

5658
self._s3 = boto3.resource(
5759
"s3",
@@ -60,11 +62,22 @@ def s3(self):
6062
)
6163
return self._s3
6264

65+
def s3client(self):
66+
if self._s3client:
67+
return self._s3client
68+
69+
self._s3client = boto3.client(
70+
"s3",
71+
endpoint_url=self.endpoint_url,
72+
config=Config(signature_version="s3v4"),
73+
)
74+
return self._s3client
75+
6376
def bucket(self):
6477
if self._bucket:
6578
return self._bucket
6679

67-
self._bucket = self.s3().Bucket(self.bucket_name)
80+
self._bucket = self.s3resource().Bucket(self.bucket_name)
6881
return self._bucket
6982

7083
def upload_file(self, source, dest):
@@ -88,7 +101,7 @@ def download_file(self, dest):
88101
if not dest:
89102
dest = self.path.split("/").pop()
90103
print(f"Downloading {self.url} to {dest}...")
91-
object = self.s3().Object(self.bucket_name, self.path)
104+
object = self.s3resource().Object(self.bucket_name, self.path)
92105
object.load()
93106

94107
with tqdm(
@@ -98,3 +111,18 @@ def download_file(self, dest):
98111
Filename=dest,
99112
Callback=lambda bytes_transffered: bar.update(bytes_transffered),
100113
)
114+
115+
def file_exists(self):
116+
# res = self.s3client().list_objects_v2(
117+
# Bucket=self.bucket_name, Prefix=self.path, MaxKeys=1
118+
# )
119+
# return "Contents" in res
120+
object = self.s3resource().Object(self.bucket_name, self.path)
121+
try:
122+
object.load()
123+
except botocore.exceptions.ClientError as error:
124+
if error.response["Error"]["Code"] == "404":
125+
return False
126+
else:
127+
raise
128+
return True

0 commit comments

Comments
 (0)