Browse Source

Add ALIYUN_OSS_PATH configuration for Aliyun OSS (#7864)

Co-authored-by: seayon <zhaoxuyang@shouqianba.com>
Seayon 7 months ago
parent
commit
78989e9049

+ 2 - 1
api/.env.example

@@ -60,7 +60,8 @@ ALIYUN_OSS_SECRET_KEY=your-secret-key
 ALIYUN_OSS_ENDPOINT=your-endpoint
 ALIYUN_OSS_AUTH_VERSION=v1
 ALIYUN_OSS_REGION=your-region
-
+# Don't start with '/'. OSS doesn't support leading slash in object names.
+ALIYUN_OSS_PATH=your-path
 # Google Storage configuration
 GOOGLE_STORAGE_BUCKET_NAME=yout-bucket-name
 GOOGLE_STORAGE_SERVICE_ACCOUNT_JSON_BASE64=your-google-service-account-json-base64-string

+ 5 - 0
api/configs/middleware/storage/aliyun_oss_storage_config.py

@@ -38,3 +38,8 @@ class AliyunOSSStorageConfig(BaseSettings):
         description="Aliyun OSS authentication version",
         default=None,
     )
+
+    ALIYUN_OSS_PATH: Optional[str] = Field(
+        description="Aliyun OSS path",
+        default=None,
+    )

+ 29 - 0
api/extensions/storage/aliyun_storage.py

@@ -15,6 +15,7 @@ class AliyunStorage(BaseStorage):
 
         app_config = self.app.config
         self.bucket_name = app_config.get("ALIYUN_OSS_BUCKET_NAME")
+        self.folder = app.config.get("ALIYUN_OSS_PATH")
         oss_auth_method = aliyun_s3.Auth
         region = None
         if app_config.get("ALIYUN_OSS_AUTH_VERSION") == "v4":
@@ -30,15 +31,29 @@ class AliyunStorage(BaseStorage):
         )
 
     def save(self, filename, data):
+        if not self.folder or self.folder.endswith("/"):
+            filename = self.folder + filename
+        else:
+            filename = self.folder + "/" + filename
         self.client.put_object(filename, data)
 
     def load_once(self, filename: str) -> bytes:
+        if not self.folder or self.folder.endswith("/"):
+            filename = self.folder + filename
+        else:
+            filename = self.folder + "/" + filename
+
         with closing(self.client.get_object(filename)) as obj:
             data = obj.read()
         return data
 
     def load_stream(self, filename: str) -> Generator:
         def generate(filename: str = filename) -> Generator:
+            if not self.folder or self.folder.endswith("/"):
+                filename = self.folder + filename
+            else:
+                filename = self.folder + "/" + filename
+
             with closing(self.client.get_object(filename)) as obj:
                 while chunk := obj.read(4096):
                     yield chunk
@@ -46,10 +61,24 @@ class AliyunStorage(BaseStorage):
         return generate()
 
     def download(self, filename, target_filepath):
+        if not self.folder or self.folder.endswith("/"):
+            filename = self.folder + filename
+        else:
+            filename = self.folder + "/" + filename
+
         self.client.get_object_to_file(filename, target_filepath)
 
     def exists(self, filename):
+        if not self.folder or self.folder.endswith("/"):
+            filename = self.folder + filename
+        else:
+            filename = self.folder + "/" + filename
+
         return self.client.object_exists(filename)
 
     def delete(self, filename):
+        if not self.folder or self.folder.endswith("/"):
+            filename = self.folder + filename
+        else:
+            filename = self.folder + "/" + filename
         self.client.delete_object(filename)

+ 2 - 0
docker/.env.example

@@ -285,6 +285,8 @@ ALIYUN_OSS_SECRET_KEY=your-secret-key
 ALIYUN_OSS_ENDPOINT=https://oss-ap-southeast-1-internal.aliyuncs.com
 ALIYUN_OSS_REGION=ap-southeast-1
 ALIYUN_OSS_AUTH_VERSION=v4
+# Don't start with '/'. OSS doesn't support leading slash in object names.
+ALIYUN_OSS_PATH=your-path
 
 # Tencent COS Configuration
 # The name of the Tencent COS bucket to use for storing files.

+ 1 - 0
docker/docker-compose.yaml

@@ -66,6 +66,7 @@ x-shared-env: &shared-api-worker-env
   ALIYUN_OSS_ENDPOINT: ${ALIYUN_OSS_ENDPOINT:-}
   ALIYUN_OSS_REGION: ${ALIYUN_OSS_REGION:-}
   ALIYUN_OSS_AUTH_VERSION: ${ALIYUN_OSS_AUTH_VERSION:-v4}
+  ALIYUN_OSS_PATHS: ${ALIYUN_OSS_PATH:-}
   TENCENT_COS_BUCKET_NAME: ${TENCENT_COS_BUCKET_NAME:-}
   TENCENT_COS_SECRET_KEY: ${TENCENT_COS_SECRET_KEY:-}
   TENCENT_COS_SECRET_ID: ${TENCENT_COS_SECRET_ID:-}