diff --git a/deploy/convert_server.py b/deploy/convert_server.py index 399d404..14bfed6 100755 --- a/deploy/convert_server.py +++ b/deploy/convert_server.py @@ -62,6 +62,8 @@ class Handler(BaseHTTPRequestHandler): self._handle_llm_ops() elif self.path == "/unzip-upload": self._handle_unzip_upload() + elif self.path == "/upload": + self._handle_upload() else: self._handle_doc_convert() @@ -277,6 +279,47 @@ class Handler(BaseHTTPRequestHandler): self.end_headers() self.wfile.write(json.dumps({"error": str(e)}, ensure_ascii=False).encode()) + def _handle_upload(self): + """Принять файл и передать в Lucee через JSON API (обходит multipart-краш Lucee).""" + from email.parser import BytesParser + + content_type = self.headers.get("Content-Type", "") + length = int(self.headers.get("Content-Length", 0)) + body = self.rfile.read(length) + + # Парсим multipart + msg = BytesParser().parsebytes( + b"Content-Type: " + content_type.encode() + b"\r\n\r\n" + body + ) + filename = None + file_data = None + 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) + break + + if not filename or not file_data: + self._send_error_cors(400, "no file in request") + return + + # Шлём в Lucee через JSON API (не multipart!) + resp = httpx.post( + f"{LUCEE_URL}/upload.cfm", + json={"filename": filename, "data": "\\x" + file_data.hex()}, + timeout=60 + ) + self._send_cors() + if resp.status_code == 200: + self.send_response(200) + self.send_header("Content-Type", "application/json; charset=utf-8") + self.end_headers() + self.wfile.write(resp.content) + else: + self._send_error_cors(502, f"Lucee error: {resp.status_code}") + def _handle_unzip_upload(self): """Распаковать ZIP и загрузить каждый файл в Lucee. Только файлы из корня архива.""" import zipfile, io diff --git a/deploy/nginx-contracts.conf b/deploy/nginx-contracts.conf index 28c5605..bb75aae 100644 --- a/deploy/nginx-contracts.conf +++ b/deploy/nginx-contracts.conf @@ -43,6 +43,15 @@ server { add_header Access-Control-Allow-Methods "GET, OPTIONS" always; } + location /upload { + add_header Access-Control-Allow-Origin "*"; + add_header Access-Control-Allow-Methods "POST, OPTIONS"; + add_header Access-Control-Allow-Headers "*"; + if ($request_method = OPTIONS) { return 204; } + proxy_pass http://127.0.0.1:8766; + client_max_body_size 100m; + } + location /unzip-upload { if ($request_method = OPTIONS) { add_header Access-Control-Allow-Origin "*"; diff --git a/index.cfm b/index.cfm index 1e35186..c2feca4 100644 --- a/index.cfm +++ b/index.cfm @@ -75,7 +75,7 @@