fix(upload): preserve fields in multipart fallback
Build and Push Docker Container / build-and-push (push) Successful in 1m40s
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:
+18
-1
@@ -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))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user