fix(upload): preserve fields in multipart fallback
Build and Push Docker Container / build-and-push (push) Successful in 1m40s

- Recover regular multipart fields when the file part is not exposed through request.files.

- Preserve expires and note values for browser uploads that need body-based file recovery.

- Add parser coverage for file parts without filenames and recovered expiry fields.

- Extend upload route tests to assert recovered uploads keep expiry metadata.

- Bump NanoShare to 1.27.3.
This commit is contained in:
2026-09-10 00:18:57 +02:00
parent 21aca1b9d7
commit 3194e534e0
6 changed files with 171 additions and 4 deletions
+18 -1
View File
@@ -1,6 +1,7 @@
from my_modules.decoratory.header import login_required
from my_modules.expiry import parse_expires, ensure_utc
from my_modules.file_meta import iso_stamp_filename, format_size
from my_modules.upload_content import parse_multipart_upload_body
from quart_common.web.wide_event import add_wide_event_context
from quart import Blueprint, request, jsonify, current_app
@@ -75,9 +76,25 @@ async def api_upload(user):
orphan_registry = getattr(current_app, 'orphan_storage_registry', None)
uploaded = files.get('file')
recovered_upload = False
recovered_fields = {}
if uploaded is None and request.mimetype == 'multipart/form-data':
recovered_parts = parse_multipart_upload_body(
await request.get_data(cache=True),
request.mimetype_params.get('boundary'),
)
uploaded = recovered_parts.file
recovered_fields = recovered_parts.fields
recovered_upload = uploaded is not None
if recovered_fields:
note = recovered_fields.get('note', note)
expires_raw = recovered_fields.get('expires', expires_raw)
text = recovered_fields.get('text', text)
has_uploaded_file = uploaded is not None
add_wide_event_context(nanoshare={"operation": "upload", "has_file": has_uploaded_file, "has_text": bool(text.strip())})
add_wide_event_context(nanoshare={"operation": "upload", "has_file": has_uploaded_file, "has_text": bool(text.strip()), "recovered_file": recovered_upload, "recovered_field_count": len(recovered_fields)})
expires_at_dt = ensure_utc(parse_expires(expires_raw))