diff --git a/deploy/services/upload.py b/deploy/services/upload.py index 42517fd..03faa5b 100644 --- a/deploy/services/upload.py +++ b/deploy/services/upload.py @@ -1,6 +1,5 @@ """Upload service — accept file, store to DB, parse.""" -import uuid, base64, json -from email.parser import BytesParser +import uuid, base64, json, io, cgi from db import documents, contracts, supplements from .parse import parse_file @@ -9,23 +8,28 @@ def handle_upload(rfile, content_type, content_length): """Parse multipart upload, store in DB, return result dict.""" body = rfile.read(content_length) - msg = BytesParser().parsebytes( - b"Content-Type: " + content_type.encode() + b"\r\n\r\n" + body - ) + environ = { + "REQUEST_METHOD": "POST", + "CONTENT_TYPE": content_type, + "CONTENT_LENGTH": str(content_length), + } + fs = cgi.FieldStorage(fp=io.BytesIO(body), environ=environ, keep_blank_values=True) + filename = None file_data = None contract_id = "" - if msg.is_multipart(): - for part in msg.get_payload(): - fn = part.get_filename() - if fn: - filename = fn - file_data = part.get_payload(decode=True) - else: - disp = part.get("Content-Disposition", "") - if 'name="contract_id"' in disp: - contract_id = part.get_payload(decode=True).decode("utf-8", errors="ignore").strip() + if "files" in fs: + item = fs["files"] + if isinstance(item, list): + item = item[0] + filename = item.filename + file_data = item.file.read() if hasattr(item, "file") else item.value + if isinstance(file_data, str): + file_data = file_data.encode("utf-8") + + if "contract_id" in fs: + contract_id = fs.getfirst("contract_id", "") if not filename or not file_data: return {"ok": False, "error": "no file in request"} @@ -33,13 +37,11 @@ def handle_upload(rfile, content_type, content_length): mime = _mime_for(filename) b64 = base64.b64encode(file_data).decode() - # Удалить старый файл с тем же именем в этом контракте if contract_id: supplements.delete_by_document(contract_id, filename) doc = documents.insert(filename, mime, b64) - # Создать контракт если нет if not contract_id: from datetime import datetime now = datetime.now() @@ -51,7 +53,6 @@ def handle_upload(rfile, content_type, content_length): supplements.insert(contract_id, doc["id"], supp_type) - # Парсинг на VM parsed = parse_file(filename, file_data) if parsed and parsed.get("status") == "parsed": documents.set_parsed(doc["id"], parsed["elements"])