from pathlib import Path from uuid import uuid4 from aioshutil import copyfileobj from fastapi import UploadFile from barcodes.images_uploader.base import BaseImagesUploader from barcodes.pdf import PDFGenerator from constants import APP_PATH, API_ROOT class BarcodeImagesUploader(BaseImagesUploader): def __init__(self): self.relative_path = Path("static/images/product_barcodes") self.storage_path = APP_PATH / self.relative_path if not Path.exists(self.storage_path): Path.mkdir(self.storage_path) def get_url(self, filename: str) -> str: file_location = self.relative_path / filename return f"{API_ROOT}/{file_location}" def delete(self, filename: str): file_location = self.storage_path / filename if file_location.exists(): file_location.unlink() async def upload(self, upload_file: UploadFile) -> str: # Create temp file in filesystem temp_filename = str(uuid4()) + '.' + upload_file.filename.split('.')[-1] temp_file_location = self.storage_path / temp_filename with open(temp_file_location, 'wb') as buffer: await copyfileobj(upload_file.file, buffer) # Generate PDF file and save it res_filename = str(uuid4()) + '.pdf' res_file_location = f"{self.storage_path}/{res_filename}" temp_file_url = f"{self.relative_path}/{temp_filename}" pdf_gen = PDFGenerator() pdf_gen.generate_barcode_image(temp_file_url, res_file_location) # Remove temp file self.delete(temp_filename) return res_filename