73 lines
2.1 KiB
Python
73 lines
2.1 KiB
Python
![]() |
import os
|
|||
|
from datetime import datetime
|
|||
|
from typing import AnyStr, BinaryIO, Callable, Union, IO
|
|||
|
from flask import send_file, Response
|
|||
|
|
|||
|
from pywxdump.file.AttachmentAbstract import Attachment
|
|||
|
from pywxdump.file.LocalAttachment import LocalAttachment
|
|||
|
from pywxdump.file.S3Attachment import S3Attachment
|
|||
|
|
|||
|
|
|||
|
def determine_strategy(file_path: str) -> Attachment:
|
|||
|
if file_path.startswith("s3://"):
|
|||
|
return S3Attachment()
|
|||
|
else:
|
|||
|
return LocalAttachment()
|
|||
|
|
|||
|
|
|||
|
def exists(path: str) -> bool:
|
|||
|
return determine_strategy(path).exists(path)
|
|||
|
|
|||
|
|
|||
|
def open_file(path: str, mode: str) -> IO:
|
|||
|
return determine_strategy(path).open(path, mode)
|
|||
|
|
|||
|
|
|||
|
def makedirs(path: str) -> bool:
|
|||
|
return determine_strategy(path).makedirs(path)
|
|||
|
|
|||
|
|
|||
|
def join(__a: str, *paths: str) -> str:
|
|||
|
return determine_strategy(__a).join(__a, *paths)
|
|||
|
|
|||
|
|
|||
|
def dirname(path: str) -> str:
|
|||
|
return determine_strategy(path).dirname(path)
|
|||
|
|
|||
|
|
|||
|
def basename(path: str) -> str:
|
|||
|
return determine_strategy(path).basename(path)
|
|||
|
|
|||
|
|
|||
|
def send_attachment(
|
|||
|
path_or_file: Union[os.PathLike[AnyStr], str],
|
|||
|
mimetype: Union[str, None] = None,
|
|||
|
as_attachment: bool = False,
|
|||
|
download_name: Union[str, None] = None,
|
|||
|
conditional: bool = True,
|
|||
|
etag: Union[bool, str] = True,
|
|||
|
last_modified: Union[datetime, int, float, None] = None,
|
|||
|
max_age: Union[None, int, Callable[[Union[str, None]], Union[int, None]]] = None,
|
|||
|
) -> Response:
|
|||
|
file_io = open_file(path_or_file, "rb")
|
|||
|
|
|||
|
# 如果没有提供 download_name 或 mimetype,则从 path_or_file 中获取文件名和 MIME 类型
|
|||
|
if download_name is None:
|
|||
|
download_name = basename(path_or_file)
|
|||
|
if mimetype is None:
|
|||
|
mimetype = 'application/octet-stream'
|
|||
|
|
|||
|
return send_file(file_io, mimetype, as_attachment, download_name, conditional, etag, last_modified, max_age)
|
|||
|
|
|||
|
|
|||
|
def download_file(db_path, local_path):
|
|||
|
with open(local_path, 'wb') as f:
|
|||
|
with open_file(db_path, 'rb') as r:
|
|||
|
f.write(r.read())
|
|||
|
return local_path
|
|||
|
|
|||
|
|
|||
|
def isLocalPath(path: str) -> bool:
|
|||
|
return isinstance(determine_strategy(path), LocalAttachment)
|
|||
|
|