45 lines
1.1 KiB
Python
45 lines
1.1 KiB
Python
from abc import ABC, abstractmethod
|
|
|
|
|
|
class ChunkUploadBackend(ABC):
|
|
@abstractmethod
|
|
def start(self, filename: str) -> None:
|
|
"""Начало загрузки нового файла"""
|
|
|
|
@abstractmethod
|
|
def upload_chunk(self, chunk: bytes) -> None:
|
|
"""Загрузка очередного чанка"""
|
|
|
|
@abstractmethod
|
|
def finish(self) -> None:
|
|
"""Завершение загрузки"""
|
|
|
|
@abstractmethod
|
|
def abort(self) -> None:
|
|
"""Прерывания загрузки"""
|
|
|
|
|
|
class DiskChunkUploadBackend(ChunkUploadBackend):
|
|
def __init__(self, base_path: str):
|
|
import os
|
|
|
|
self.os = os
|
|
|
|
self.base_path = base_path
|
|
self.os.makedirs(self.base_path, exist_ok=True)
|
|
self._file = None
|
|
|
|
def start(self, filename):
|
|
self._file = open(self.os.path.join(self.base_path, filename), "wb")
|
|
|
|
def upload_chunk(self, chunk: bytes):
|
|
self._file.write(chunk)
|
|
|
|
def finish(self):
|
|
self._file.close()
|
|
|
|
def abort(self):
|
|
if self._file:
|
|
self._file.close()
|
|
self._file = None
|