"""Functions dealing with chunking of files.""" from pathlib import Path from typing import Iterator from flask import current_app as app from werkzeug.utils import secure_filename def chunked_binary_read(filepath: Path, chunksize: int = 2048) -> Iterator: """Read a file in binary mode in chunks.""" with open(filepath, "rb") as inputfile: while True: data = inputfile.read(chunksize) if data != b"": yield data continue break def chunk_name(uploadfilename: str, chunkno: int) -> str: """Generate chunk name from original filename and chunk number""" if uploadfilename == "": raise ValueError("Name cannot be empty!") if chunkno < 1: raise ValueError("Chunk number must be greater than zero") return f"{secure_filename(uploadfilename)}_part_{chunkno:05d}" def chunks_directory(uniqueidentifier: str) -> Path: """Compute the directory where chunks are temporarily stored.""" if uniqueidentifier == "": raise ValueError("Unique identifier cannot be empty!") return Path(app.config["UPLOAD_FOLDER"], f"tempdir_{uniqueidentifier}")