fixed bug to upload large file.
This commit is contained in:
@ -1 +1 @@
|
||||
1.3.1
|
||||
1.3.4
|
||||
|
@ -1,8 +1,10 @@
|
||||
import mimetypes
|
||||
import os
|
||||
from typing import Any, Final
|
||||
|
||||
from pydantic import TypeAdapter
|
||||
from pydantic.dataclasses import dataclass
|
||||
from requests_toolbelt.multipart.encoder import MultipartEncoder
|
||||
|
||||
from mdrsclient.api.base import BaseApi
|
||||
from mdrsclient.api.utils import token_check
|
||||
@ -17,6 +19,7 @@ class FilesApiCreateResponse:
|
||||
|
||||
class FilesApi(BaseApi):
|
||||
ENTRYPOINT: Final[str] = "v3/files/"
|
||||
FALLBACK_MIMETYPE: Final[str] = "application/octet-stream"
|
||||
|
||||
def retrieve(self, id: str) -> File:
|
||||
# print(self.__class__.__name__ + "::" + sys._getframe().f_code.co_name)
|
||||
@ -30,30 +33,42 @@ class FilesApi(BaseApi):
|
||||
# print(self.__class__.__name__ + "::" + sys._getframe().f_code.co_name)
|
||||
url = self.ENTRYPOINT
|
||||
token_check(self.connection)
|
||||
data: dict[str, str | int] = {"folder_id": folder_id}
|
||||
data: dict[str, str | int] | MultipartEncoder = {}
|
||||
try:
|
||||
with open(os.path.realpath(path), mode="rb") as fp:
|
||||
response = self.connection.post(url, data=data, files={"file": fp})
|
||||
data = MultipartEncoder(
|
||||
fields={"folder_id": folder_id, "file": (os.path.basename(path), fp, self._get_mime_type(path))}
|
||||
)
|
||||
response = self.connection.post(url, data=data, headers={"Content-Type": data.content_type})
|
||||
self._raise_response_error(response)
|
||||
ret = TypeAdapter(FilesApiCreateResponse).validate_python(response.json())
|
||||
except OSError:
|
||||
raise UnexpectedException(f"Could not open `{path}` file.")
|
||||
except MemoryError:
|
||||
raise UnexpectedException("Out of memory.")
|
||||
except Exception as e:
|
||||
print(e)
|
||||
raise UnexpectedException(e)
|
||||
return ret.id
|
||||
|
||||
def update(self, file: File, path: str | None) -> bool:
|
||||
# print(self.__class__.__name__ + "::" + sys._getframe().f_code.co_name)
|
||||
url = self.ENTRYPOINT + file.id + "/"
|
||||
token_check(self.connection)
|
||||
data: dict[str, str | int] | MultipartEncoder = {}
|
||||
if path is not None:
|
||||
# update file body
|
||||
try:
|
||||
with open(os.path.realpath(path), mode="rb") as fp:
|
||||
response = self.connection.put(url, files={"file": fp})
|
||||
data = MultipartEncoder(fields={"file": (os.path.basename(path), fp, self._get_mime_type(path))})
|
||||
response = self.connection.put(url, data=data, headers={"Content-Type": data.content_type})
|
||||
except OSError:
|
||||
raise UnexpectedException(f"Could not open `{path}` file.")
|
||||
except MemoryError:
|
||||
raise UnexpectedException("Out of memory.")
|
||||
else:
|
||||
# update metadata
|
||||
data: dict[str, str | int] = {"name": file.name, "description": file.description}
|
||||
data = {"name": file.name, "description": file.description}
|
||||
response = self.connection.put(url, data=data)
|
||||
self._raise_response_error(response)
|
||||
return True
|
||||
@ -106,3 +121,9 @@ class FilesApi(BaseApi):
|
||||
except PermissionError:
|
||||
print(f"Cannot create file `{path}`: Permission denied.")
|
||||
return True
|
||||
|
||||
def _get_mime_type(self, path: str) -> str:
|
||||
mt = mimetypes.guess_type(path)
|
||||
if mt:
|
||||
return mt[0] or self.FALLBACK_MIMETYPE
|
||||
return self.FALLBACK_MIMETYPE
|
||||
|
@ -106,4 +106,4 @@ class UploadCommand(BaseCommand):
|
||||
file_api.update(file, info.path)
|
||||
print(os.path.join(info.folder.path, basename))
|
||||
except MDRSException as e:
|
||||
print(f"API Error: {e}")
|
||||
print(f"Error: {e}")
|
||||
|
@ -1,9 +1,9 @@
|
||||
import platform
|
||||
import threading
|
||||
from io import BufferedReader
|
||||
from typing import TypedDict
|
||||
|
||||
from requests import Response, Session
|
||||
from requests_toolbelt.multipart.encoder import MultipartEncoder
|
||||
|
||||
# Unpack is new in 3.11
|
||||
from typing_extensions import Unpack
|
||||
@ -21,14 +21,14 @@ class _KwArgsMDRSConnectionGet(TypedDict, total=False):
|
||||
|
||||
class _KwArgsMDRSConnectionPost(TypedDict, total=False):
|
||||
params: dict[str, str | int]
|
||||
data: dict[str, str | int]
|
||||
files: dict[str, BufferedReader]
|
||||
data: dict[str, str | int] | MultipartEncoder
|
||||
headers: dict[str, str]
|
||||
|
||||
|
||||
class _KwArgsMDRSConnectionPut(TypedDict, total=False):
|
||||
params: dict[str, str | int]
|
||||
data: dict[str, str | int]
|
||||
files: dict[str, BufferedReader]
|
||||
data: dict[str, str | int] | MultipartEncoder
|
||||
headers: dict[str, str]
|
||||
|
||||
|
||||
class _KwArgsMDRSConnectionDelete(TypedDict, total=False):
|
||||
|
Reference in New Issue
Block a user