Merge pull request #84 from Do1e/master
fix: OneDriveFileStorage下载文件的文件名与上传时不一致的问题
This commit is contained in:
+19
-9
@@ -85,6 +85,7 @@ class OneDriveFileStorage:
|
|||||||
self.client_id = settings.onedrive_client_id
|
self.client_id = settings.onedrive_client_id
|
||||||
self.username = settings.onedrive_username
|
self.username = settings.onedrive_username
|
||||||
self.password = settings.onedrive_password
|
self.password = settings.onedrive_password
|
||||||
|
self._ClientRequestException = ClientRequestException
|
||||||
|
|
||||||
try:
|
try:
|
||||||
client = GraphClient(self.acquire_token_pwd)
|
client = GraphClient(self.acquire_token_pwd)
|
||||||
@@ -116,19 +117,28 @@ class OneDriveFileStorage:
|
|||||||
path = str(path).replace('\\', '/').replace('//', '/').split('/')
|
path = str(path).replace('\\', '/').replace('//', '/').split('/')
|
||||||
else:
|
else:
|
||||||
raise TypeError('path must be str or Path')
|
raise TypeError('path must be str or Path')
|
||||||
return '/'.join(path[:-1]), path[-1]
|
path[-1] = path[-1].split('.')[0]
|
||||||
|
return '/'.join(path)
|
||||||
|
|
||||||
def _save(self, file, save_path):
|
def _save(self, file, save_path):
|
||||||
content = file.read()
|
content = file.file.read()
|
||||||
path, name = self._get_path_str(save_path)
|
name = file.filename
|
||||||
|
path = self._get_path_str(save_path)
|
||||||
self.root_path.get_by_path(path).upload(name, content).execute_query()
|
self.root_path.get_by_path(path).upload(name, content).execute_query()
|
||||||
|
|
||||||
async def save_file(self, file: UploadFile, save_path: str):
|
async def save_file(self, file: UploadFile, save_path: str):
|
||||||
await asyncio.to_thread(self._save, file.file, save_path)
|
await asyncio.to_thread(self._save, file, save_path)
|
||||||
|
|
||||||
def _delete(self, save_path):
|
def _delete(self, save_path):
|
||||||
path, name = self._get_path_str(save_path)
|
path = self._get_path_str(save_path)
|
||||||
self.root_path.get_by_path(path + '/' + name).delete_object().execute_query()
|
try:
|
||||||
|
self.root_path.get_by_path(path).delete_object().execute_query()
|
||||||
|
except self._ClientRequestException as e:
|
||||||
|
if e.code == 'itemNotFound':
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
raise e
|
||||||
|
|
||||||
|
|
||||||
async def delete_file(self, file_code: FileCodes):
|
async def delete_file(self, file_code: FileCodes):
|
||||||
await asyncio.to_thread(self._delete, await file_code.get_file_path())
|
await asyncio.to_thread(self._delete, await file_code.get_file_path())
|
||||||
@@ -139,8 +149,8 @@ class OneDriveFileStorage:
|
|||||||
p3 = re.search(rf'{p2}\/(.+)', link).group(1)
|
p3 = re.search(rf'{p2}\/(.+)', link).group(1)
|
||||||
return f'https://{p1}.sharepoint.com/personal/{p2}/_layouts/52/download.aspx?share={p3}'
|
return f'https://{p1}.sharepoint.com/personal/{p2}/_layouts/52/download.aspx?share={p3}'
|
||||||
|
|
||||||
def _get_file_url(self, save_path):
|
def _get_file_url(self, save_path, name):
|
||||||
path, name = self._get_path_str(save_path)
|
path = self._get_path_str(save_path)
|
||||||
remote_file = self.root_path.get_by_path(path + '/' + name)
|
remote_file = self.root_path.get_by_path(path + '/' + name)
|
||||||
expiration_datetime = datetime.datetime.now(tz=datetime.timezone.utc) + datetime.timedelta(hours=1)
|
expiration_datetime = datetime.datetime.now(tz=datetime.timezone.utc) + datetime.timedelta(hours=1)
|
||||||
expiration_datetime = expiration_datetime.strftime("%Y-%m-%dT%H:%M:%SZ")
|
expiration_datetime = expiration_datetime.strftime("%Y-%m-%dT%H:%M:%SZ")
|
||||||
@@ -150,7 +160,7 @@ class OneDriveFileStorage:
|
|||||||
async def get_file_url(self, file_code: FileCodes):
|
async def get_file_url(self, file_code: FileCodes):
|
||||||
if file_code.prefix == '文本分享':
|
if file_code.prefix == '文本分享':
|
||||||
return file_code.text
|
return file_code.text
|
||||||
result = await asyncio.to_thread(self._get_file_url, await file_code.get_file_path())
|
result = await asyncio.to_thread(self._get_file_url, await file_code.get_file_path(), f'{file_code.prefix}{file_code.suffix}')
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -70,4 +70,4 @@ async def index():
|
|||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
import uvicorn
|
import uvicorn
|
||||||
|
|
||||||
uvicorn.run(app='main:app', host="0.0.0.0", port=12345, reload=False, workers=1)
|
uvicorn.run(app='main:app', host="0.0.0.0", port=settings.port, reload=False, workers=1)
|
||||||
|
|||||||
+1
-3
@@ -1,8 +1,6 @@
|
|||||||
# OneDrive作为存储的配置方法
|
# OneDrive作为存储的配置方法
|
||||||
|
|
||||||
**仅支持工作或学习账户,并且需要有管理员权限以授权API**
|
**仅支持工作或学校账户,并且需要有管理员权限以授权API**
|
||||||
|
|
||||||
已知问题:下载文件时文件名会变为uuid,与上传时的文件名不一致。
|
|
||||||
|
|
||||||
## 1. 需要配置的参数
|
## 1. 需要配置的参数
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user