feat: add integration with opendal

Signed-off-by: silver-ymz <yinmingzhuo@gmail.com>
This commit is contained in:
silver-ymz
2023-08-23 16:41:01 +08:00
parent c071995ddd
commit 5d1f7fa1f0
+27
View File
@@ -163,6 +163,32 @@ class OneDriveFileStorage:
result = await asyncio.to_thread(self._get_file_url, await file_code.get_file_path(), f'{file_code.prefix}{file_code.suffix}')
return result
class OpenDALFileStorage:
def __init__(self):
try:
import opendal
except ImportError:
raise ImportError('请先安装 `opendal`, 例如: "pip install opendal"')
self.service = settings.opendal_scheme
service_settings = {}
for key, value in settings.items():
if key.startswith('opendal_' + self.service):
setting_name = key.split('_', 2)[2]
service_settings[setting_name] = value
self.operator = opendal.AsyncOperator(settings.opendal_scheme, **service_settings)
async def save_file(self, file: UploadFile, save_path: str):
await self.operator.write(save_path, file.file)
async def delete_file(self, file_code: FileCodes):
await self.operator.delete(await file_code.get_file_path())
async def get_file_url(self, file_code: FileCodes):
# todo: It needs upstream to expose presign api from rust to python
if file_code.prefix == '文本分享':
return file_code.text
result = await self.operator.presign_read(await file_code.get_file_path())
return result
class FileStorageTemplate:
def __init__(self):
@@ -182,5 +208,6 @@ storages = {
'local': SystemFileStorage,
's3': S3FileStorage,
'onedrive': OneDriveFileStorage,
'opendal': OpenDALFileStorage,
}
file_storage = storages[settings.file_storage]()