From 21e25b2801f5718831ad6e64f588307d2746b6ae Mon Sep 17 00:00:00 2001 From: Marcel Gansfusz Date: Fri, 28 Feb 2025 02:25:34 +0100 Subject: [PATCH] added handling for filetypes --- app/__pycache__/main.cpython-313.pyc | Bin 18688 -> 23378 bytes app/files/türschild_ausdrucken.pdf | Bin 49728 -> 0 bytes app/main.py | 157 +++++++++++++++++++++++++-- database_init.sql | 2 +- index.html | 4 +- static/app.js | 7 +- 6 files changed, 152 insertions(+), 18 deletions(-) diff --git a/app/__pycache__/main.cpython-313.pyc b/app/__pycache__/main.cpython-313.pyc index 9dc825c0511a6fdf1786addc61dfb6e43351eab8..7eb32807ef33e7b23378160e7ad86fc52a1faf19 100644 GIT binary patch delta 8790 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 delta 4683 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,YcBs4n9eLB{G18L^3m2u`QiCnMS1f04)C9*-Cv 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 diff --git a/app/main.py b/app/main.py index 4a23c7a..973cee2 100644 --- a/app/main.py +++ b/app/main.py @@ -14,6 +14,10 @@ import re import os import mariadb +import filetype + +import datetime + app = FastAPI() @@ -36,6 +40,7 @@ SUBCAT_CATEGORIES_I = [1, 2, 3] EX_DATE_CATEGORIES = ["Prüfungen", "Klausuren"] EX_DATE_CATEGORIES_I = [0, 1] UNIZEUG_PATH = "./app/dest/" +FILES_IN_PROGRESS = "./app/files/" # cur = db.cursor() @@ -51,9 +56,9 @@ async def get_index(): @app.get("/files/{file_id}") async def get_file(file_id: str): if file_id == "unsupported": - return FileResponse(".app/files/unsupported.pdf") + return FileResponse(FILES_IN_PROGRESS + "unsupported.pdf") if file_id == "empty": - return FileResponse(".app/files/empty.pdf") + return FileResponse(FILES_IN_PROGRESS + "empty.pdf") cur = db.cursor() try: cur.execute("Select filename from FIP where id=?", (file_id,)) @@ -63,7 +68,7 @@ async def get_file(file_id: str): status_code=500, detail="Somethings wrong with the database" ) filename = cur.fetchone()[0] - return FileResponse(f"./app/files/{filename}") + return FileResponse(FILES_IN_PROGRESS + filename) @app.get("/search/lva") @@ -171,14 +176,57 @@ async def search_subcats( @app.post("/uploadfile/") -async def create_upload_file(file: UploadFile): - content = await file.read() - filename = file.filename if file.filename is not None else "None" - locpath = "./app/files/" + filename +async def create_upload_file(files: List[UploadFile], c2pdf: bool = True): + if len(files) == 0: + raise HTTPException(status_code=400, detail="No files found in file submission") + filename = files[0].filename if files[0].filename is not None else "None" + if len(files) == 1: + content = await files[0].read() + ft = filetype.guess(content).extension + if c2pdf and ft != "pdf": + ret = convert_to_pdf(content) + if ret is not None: + content = ret + filename = filename_to_pdf(filename) + ft = "pdf" + else: + filecontents = [] + for file in files: + content = await file.read() + ft = filetype.guess(content).extension + if ft == "pdf": + filecontents.append(content) + continue + if c2pdf: + res = convert_to_pdf(content) + if res is None: + filename = await save_files_to_folder(files) + content = None + ft = "dir" + break + filecontents.append(res) + else: + filename = await save_files_to_folder(files) + content = None + ft = "dir" + break + else: # is executed when the loop was not broken out of + filename = filename_to_pdf(filename) + ft = "pdf" + doc = pymupdf.open() + for content in filecontents: + doc.insert_pdf(pymupdf.open("pdf", content)) + content = doc.tobytes() + if ft != "dir": + filename = make_filename_unique(filename) + locpath = FILES_IN_PROGRESS + filename # locpaths.append(locpath) cur = db.cursor() try: - cur.execute("Insert Into FIP (filename) Values(?)", (filename,)) + cur.execute( + "Insert Into FIP (filename,filetype,initTimeStamp) Values(?,?,?)", + (filename, ft, str(datetime.datetime.now())), + ) except mariadb.Error as e: print(f"Error: {e}") raise HTTPException( @@ -192,15 +240,16 @@ async def create_upload_file(file: UploadFile): status_code=500, detail="Somethings wrong with the database" ) id = cur.fetchone()[0] - with open(locpath, "wb") as f: - f.write(content) + if content is not None: + with open(locpath, "wb") as f: + f.write(content) # app.mount("/files", StaticFiles(directory="./app/files/"), name="files") db.commit() fname = "".join(filename.split(".")[0:-1]) - ftype = filename.split(".")[-1] + # ftype = filename.split(".")[-1] return { "filename": fname, - "filetype": ftype, + "filetype": ft, "path": "/files/" + id, "fid": id, } @@ -432,6 +481,90 @@ def linkLP(lid: int, pid: int): db.commit() +def convert_to_pdf(file: bytes) -> bytes | None: + # ft = filetype.guess(file) + # cid = hash(file) + # if ( + # ft.mime + # == "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + # ): + # with open(f"./app/convert_temp/input{cid}.docx", "wb") as f: + # f.write(file) + # docx2pdf.convert( + # f"./app/convert_temp/input{cid}.docx", f"./app/convert_temp/output{cid}.pdf" + # ) + # with open(f"./app/convert_temp/output{cid}.pdf", "rb") as f: + # cont = f.read() + # os.remove(f"./app/convert_temp/input{cid}.docx") + # os.remove(f"./app/convert_temp/output{cid}.pdf") + # return cont + # elif ( + # ft.mime + # == "application/vnd.openxmlformats-officedocument.presentationml.presentation" + # ): + # with open("f./app/convert_temp/input{cid}.pptx", "wb") as f: + # f.write(file) + # pptxtopdf.convert( + # f"./app/convert_temp/input{cid}.pptx", f"./app/convert_temp/output{cid}.pdf" + # ) + # with open(f"./app/convert_temp/output{cid}.pdf", "rb") as f: + # cont = f.read() + # os.remove(f"./app/convert_temp/input{cid}.pptx") + # os.remove(f"./app/convert_temp/output{cid}.pdf") + # return cont + try: + doc = pymupdf.Document(stream=file) + return doc.convert_to_pdf() + except (pymupdf.mupdf.FzErrorUnsupported, pymupdf.FileDataError) as e: + print(e) + return None + + +def filename_to_pdf(filename: str) -> str: + farr = filename.split(".") + if len(farr) > 1: + farr[-1] = "pdf" + filename = ".".join(farr) + else: + filename = filename + ".pdf" + return filename + + +def make_filename_unique(filename: str, idx: int | None = None) -> str: + cur = db.cursor() + cur.execute("SELECT id FROM FIP WHERE filename=?", (filename,)) + res = cur.fetchall() + if res is not None and len(res) > 0: + farr = filename.split(".") + if len(farr) > 1: + farr[-2] = ( + farr[-2][:-1] + str(idx + 1) if idx is not None else farr[-2] + "_0" + ) + filename = ".".join(farr) + else: + filename = ( + filename[:-1] + str(idx + 1) if idx is not None else filename + "_0" + ) + idx = 0 if idx is None else idx + 1 + idx = idx if idx < 10 else idx - 10 + filename = make_filename_unique(filename, idx) + return filename + + +async def save_files_to_folder(files: List[UploadFile]) -> str: + filename = files[0].filename if files[0].filename is not None else "None" + filename = filename.split(".")[0] + if filename == "": + filename = "None" + filename = make_filename_unique(filename) + os.mkdir(FILES_IN_PROGRESS + filename) + for idx, file in enumerate(files): + fn = file.filename if file.filename is not None else "None" + str(idx) + with open(FILES_IN_PROGRESS + filename + "/" + fn, "wb") as f: + f.write(await file.read()) + return filename + + # async def get_submittion(request: Request): # reqJson = await request.form() # print(reqJson) diff --git a/database_init.sql b/database_init.sql index 5adf659..8df9173 100644 --- a/database_init.sql +++ b/database_init.sql @@ -4,4 +4,4 @@ CREATE TABLE LVAs(id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,lvid VARCHAR(6) CREATE TABLE Profs(id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,name VARCHAR(256),PRIMARY KEY(id)); CREATE TABLE LPLink(id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,LId bigint(20),PId bigint(20),PRIMARY KEY(id)); CREATE TABLE SubCats(id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,LId BIGINT(20),PId BIGINT(20),cat TINYINT UNSIGNED,name VARCHAR(256), PRIMARY KEY(id)); -CREATE TABLE FIP(id UUID DEFAULT(UUID()), filename VARCHAR(256), PRIMARY KEY(id)); +CREATE TABLE FIP(id UUID DEFAULT(UUID()), filename VARCHAR(256), filetype VARCHAR(8),initTimeStamp DATETIME, PRIMARY KEY(id)); diff --git a/index.html b/index.html index 8b93d81..a7a0e93 100644 --- a/index.html +++ b/index.html @@ -19,9 +19,9 @@
-
+ - +
diff --git a/static/app.js b/static/app.js index 55aec10..944de8f 100644 --- a/static/app.js +++ b/static/app.js @@ -296,13 +296,14 @@ async function submitForm(formData) { function uploadPdf(eve) { eve.preventDefault(); const fileupload = document.querySelector("#filepicker"); - const file = fileupload.files[0]; + const file = fileupload.files; if (!file) { alert("Please Choose a file"); return; } - const formData = new FormData(); - formData.append("file", file); + const form = document.querySelector("#uploadform"); + const formData = new FormData(form); + //formData.append("files", file); uploadFile(formData); } async function uploadFile(formData) {