mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-08-12 20:29:02 +08:00
feat: add aliyun oss storage (#3690)
Co-authored-by: henrybit <qipenghui3056@sina.com>
This commit is contained in:
parent
0ac0f0ffd0
commit
80b9507e7a
@ -52,6 +52,11 @@ AZURE_BLOB_ACCOUNT_NAME=your-account-name
|
|||||||
AZURE_BLOB_ACCOUNT_KEY=your-account-key
|
AZURE_BLOB_ACCOUNT_KEY=your-account-key
|
||||||
AZURE_BLOB_CONTAINER_NAME=yout-container-name
|
AZURE_BLOB_CONTAINER_NAME=yout-container-name
|
||||||
AZURE_BLOB_ACCOUNT_URL=https://<your_account_name>.blob.core.windows.net
|
AZURE_BLOB_ACCOUNT_URL=https://<your_account_name>.blob.core.windows.net
|
||||||
|
# Aliyun oss Storage configuration
|
||||||
|
ALIYUN_OSS_BUCKET_NAME=your-bucket-name
|
||||||
|
ALIYUN_OSS_ACCESS_KEY=your-access-key
|
||||||
|
ALIYUN_OSS_SECRET_KEY=your-secret-key
|
||||||
|
ALIYUN_OSS_ENDPOINT=your-endpoint
|
||||||
|
|
||||||
# CORS configuration
|
# CORS configuration
|
||||||
WEB_API_CORS_ALLOW_ORIGINS=http://127.0.0.1:3000,*
|
WEB_API_CORS_ALLOW_ORIGINS=http://127.0.0.1:3000,*
|
||||||
|
@ -208,6 +208,10 @@ class Config:
|
|||||||
self.AZURE_BLOB_ACCOUNT_KEY = get_env('AZURE_BLOB_ACCOUNT_KEY')
|
self.AZURE_BLOB_ACCOUNT_KEY = get_env('AZURE_BLOB_ACCOUNT_KEY')
|
||||||
self.AZURE_BLOB_CONTAINER_NAME = get_env('AZURE_BLOB_CONTAINER_NAME')
|
self.AZURE_BLOB_CONTAINER_NAME = get_env('AZURE_BLOB_CONTAINER_NAME')
|
||||||
self.AZURE_BLOB_ACCOUNT_URL = get_env('AZURE_BLOB_ACCOUNT_URL')
|
self.AZURE_BLOB_ACCOUNT_URL = get_env('AZURE_BLOB_ACCOUNT_URL')
|
||||||
|
self.ALIYUN_OSS_BUCKET_NAME=get_env('ALIYUN_OSS_BUCKET_NAME')
|
||||||
|
self.ALIYUN_OSS_ACCESS_KEY=get_env('ALIYUN_OSS_ACCESS_KEY')
|
||||||
|
self.ALIYUN_OSS_SECRET_KEY=get_env('ALIYUN_OSS_SECRET_KEY')
|
||||||
|
self.ALIYUN_OSS_ENDPOINT=get_env('ALIYUN_OSS_ENDPOINT')
|
||||||
|
|
||||||
# ------------------------
|
# ------------------------
|
||||||
# Vector Store Configurations.
|
# Vector Store Configurations.
|
||||||
|
@ -6,6 +6,7 @@ from datetime import datetime, timedelta, timezone
|
|||||||
from typing import Union
|
from typing import Union
|
||||||
|
|
||||||
import boto3
|
import boto3
|
||||||
|
import oss2 as aliyun_s3
|
||||||
from azure.storage.blob import AccountSasPermissions, BlobServiceClient, ResourceTypes, generate_account_sas
|
from azure.storage.blob import AccountSasPermissions, BlobServiceClient, ResourceTypes, generate_account_sas
|
||||||
from botocore.client import Config
|
from botocore.client import Config
|
||||||
from botocore.exceptions import ClientError
|
from botocore.exceptions import ClientError
|
||||||
@ -42,7 +43,14 @@ class Storage:
|
|||||||
)
|
)
|
||||||
self.client = BlobServiceClient(account_url=app.config.get('AZURE_BLOB_ACCOUNT_URL'),
|
self.client = BlobServiceClient(account_url=app.config.get('AZURE_BLOB_ACCOUNT_URL'),
|
||||||
credential=sas_token)
|
credential=sas_token)
|
||||||
|
elif self.storage_type == 'aliyun-oss':
|
||||||
|
self.bucket_name = app.config.get('ALIYUN_OSS_BUCKET_NAME')
|
||||||
|
self.client = aliyun_s3.Bucket(
|
||||||
|
aliyun_s3.Auth(app.config.get('ALIYUN_OSS_ACCESS_KEY'), app.config.get('ALIYUN_OSS_SECRET_KEY')),
|
||||||
|
app.config.get('ALIYUN_OSS_ENDPOINT'),
|
||||||
|
self.bucket_name,
|
||||||
|
connect_timeout=30
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
self.folder = app.config.get('STORAGE_LOCAL_PATH')
|
self.folder = app.config.get('STORAGE_LOCAL_PATH')
|
||||||
if not os.path.isabs(self.folder):
|
if not os.path.isabs(self.folder):
|
||||||
@ -54,6 +62,8 @@ class Storage:
|
|||||||
elif self.storage_type == 'azure-blob':
|
elif self.storage_type == 'azure-blob':
|
||||||
blob_container = self.client.get_container_client(container=self.bucket_name)
|
blob_container = self.client.get_container_client(container=self.bucket_name)
|
||||||
blob_container.upload_blob(filename, data)
|
blob_container.upload_blob(filename, data)
|
||||||
|
elif self.storage_type == 'aliyun-oss':
|
||||||
|
self.client.put_object(filename, data)
|
||||||
else:
|
else:
|
||||||
if not self.folder or self.folder.endswith('/'):
|
if not self.folder or self.folder.endswith('/'):
|
||||||
filename = self.folder + filename
|
filename = self.folder + filename
|
||||||
@ -86,6 +96,9 @@ class Storage:
|
|||||||
blob = self.client.get_container_client(container=self.bucket_name)
|
blob = self.client.get_container_client(container=self.bucket_name)
|
||||||
blob = blob.get_blob_client(blob=filename)
|
blob = blob.get_blob_client(blob=filename)
|
||||||
data = blob.download_blob().readall()
|
data = blob.download_blob().readall()
|
||||||
|
elif self.storage_type == 'aliyun-oss':
|
||||||
|
with closing(self.client.get_object(filename)) as obj:
|
||||||
|
data = obj.read()
|
||||||
else:
|
else:
|
||||||
if not self.folder or self.folder.endswith('/'):
|
if not self.folder or self.folder.endswith('/'):
|
||||||
filename = self.folder + filename
|
filename = self.folder + filename
|
||||||
@ -118,6 +131,10 @@ class Storage:
|
|||||||
with closing(blob.download_blob()) as blob_stream:
|
with closing(blob.download_blob()) as blob_stream:
|
||||||
while chunk := blob_stream.readall(4096):
|
while chunk := blob_stream.readall(4096):
|
||||||
yield chunk
|
yield chunk
|
||||||
|
elif self.storage_type == 'aliyun-oss':
|
||||||
|
with closing(self.client.get_object(filename)) as obj:
|
||||||
|
while chunk := obj.read(4096):
|
||||||
|
yield chunk
|
||||||
else:
|
else:
|
||||||
if not self.folder or self.folder.endswith('/'):
|
if not self.folder or self.folder.endswith('/'):
|
||||||
filename = self.folder + filename
|
filename = self.folder + filename
|
||||||
@ -142,6 +159,8 @@ class Storage:
|
|||||||
with open(target_filepath, "wb") as my_blob:
|
with open(target_filepath, "wb") as my_blob:
|
||||||
blob_data = blob.download_blob()
|
blob_data = blob.download_blob()
|
||||||
blob_data.readinto(my_blob)
|
blob_data.readinto(my_blob)
|
||||||
|
elif self.storage_type == 'aliyun-oss':
|
||||||
|
self.client.get_object_to_file(filename, target_filepath)
|
||||||
else:
|
else:
|
||||||
if not self.folder or self.folder.endswith('/'):
|
if not self.folder or self.folder.endswith('/'):
|
||||||
filename = self.folder + filename
|
filename = self.folder + filename
|
||||||
@ -164,6 +183,8 @@ class Storage:
|
|||||||
elif self.storage_type == 'azure-blob':
|
elif self.storage_type == 'azure-blob':
|
||||||
blob = self.client.get_blob_client(container=self.bucket_name, blob=filename)
|
blob = self.client.get_blob_client(container=self.bucket_name, blob=filename)
|
||||||
return blob.exists()
|
return blob.exists()
|
||||||
|
elif self.storage_type == 'aliyun-oss':
|
||||||
|
return self.client.object_exists(filename)
|
||||||
else:
|
else:
|
||||||
if not self.folder or self.folder.endswith('/'):
|
if not self.folder or self.folder.endswith('/'):
|
||||||
filename = self.folder + filename
|
filename = self.folder + filename
|
||||||
@ -178,6 +199,8 @@ class Storage:
|
|||||||
elif self.storage_type == 'azure-blob':
|
elif self.storage_type == 'azure-blob':
|
||||||
blob_container = self.client.get_container_client(container=self.bucket_name)
|
blob_container = self.client.get_container_client(container=self.bucket_name)
|
||||||
blob_container.delete_blob(filename)
|
blob_container.delete_blob(filename)
|
||||||
|
elif self.storage_type == 'aliyun-oss':
|
||||||
|
self.client.delete_object(filename)
|
||||||
else:
|
else:
|
||||||
if not self.folder or self.folder.endswith('/'):
|
if not self.folder or self.folder.endswith('/'):
|
||||||
filename = self.folder + filename
|
filename = self.folder + filename
|
||||||
|
@ -80,3 +80,4 @@ lxml==5.1.0
|
|||||||
xlrd~=2.0.1
|
xlrd~=2.0.1
|
||||||
pydantic~=1.10.0
|
pydantic~=1.10.0
|
||||||
pgvecto-rs==0.1.4
|
pgvecto-rs==0.1.4
|
||||||
|
oss2==2.15.0
|
Loading…
x
Reference in New Issue
Block a user