{"record":{"id":"aec35b3e39d5672f","repo":"reflex-dev/reflex","slug":"invalid-upload-chunk-disposition","errorCode":null,"errorMessage":"Invalid upload chunk disposition.","messagePattern":"Invalid upload chunk disposition\\.","errorType":"exception","errorClass":"MultiPartException","httpStatus":null,"severity":"error","filePath":"packages/reflex-components-core/src/reflex_components_core/core/_upload.py","lineNumber":388,"sourceCode":"        \"\"\"Store the completed multipart header.\"\"\"\n        field = self._current_partial_header_name.lower()\n        if field == b\"content-disposition\":\n            self._current_part.content_disposition = self._current_partial_header_value\n        self._current_part.item_headers.append((\n            field,\n            self._current_partial_header_value,\n        ))\n        self._current_partial_header_name = b\"\"\n        self._current_partial_header_value = b\"\"\n\n    def on_headers_finished(self) -> None:\n        \"\"\"Parse upload metadata from multipart headers.\"\"\"\n        disposition, options = parse_options_header(\n            self._current_part.content_disposition\n        )\n        if disposition != b\"form-data\":\n            msg = \"Invalid upload chunk disposition.\"\n            raise MultiPartException(msg)\n\n        try:\n            field_name = _user_safe_decode(options[b\"name\"], self._charset)\n        except KeyError as err:\n            msg = 'The Content-Disposition header field \"name\" must be provided.'\n            raise MultiPartException(msg) from err\n\n        if b\"filename\" not in options:\n            # Capture the bound-args field; ignore any other non-file field.\n            if field_name == UPLOAD_EVENT_ARGS_FIELD:\n                if self._seen_upload_chunk:\n                    # The handler is dispatched at the first file part, so a late\n                    # args field would be silently dropped; reject it loudly.\n                    msg = \"Upload event args must precede the file parts.\"\n                    raise MultiPartException(msg)\n                self._current_part.is_text_field = True\n                self._args_buffer = bytearray()\n            return","sourceCodeStart":370,"sourceCodeEnd":406,"githubUrl":"https://github.com/reflex-dev/reflex/blob/45b8ed5ab735f8a56bbb09a42384f030eb0208e7/packages/reflex-components-core/src/reflex_components_core/core/_upload.py#L370-L406","documentation":"Each multipart part in a streaming upload must use Content-Disposition: form-data. The Reflex parser rejects other dispositions (attachment, inline, etc.) with MultiPartException because it can only process form fields and file parts.","triggerScenarios":"A client (curl -F, custom fetch, or non-browser tool) sends a part with Content-Disposition: attachment or inline instead of form-data in a streaming upload request.","commonSituations":"Custom upload scripts/tools that set nonstandard dispositions; proxies or middlewares rewriting multipart headers; hand-rolled multipart bodies in tests.","solutions":["Send parts with standard Content-Disposition: form-data; name=\"...\" headers","Use a real FormData object in the browser or curl -F so dispositions are correct","Check for proxy/middleware that rewrites multipart headers"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"disposition, _ = parse_options_header(part_header)\nassert disposition == b\"form-data\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use standard multipart clients that emit form-data dispositions","Avoid hand-building multipart bodies"],"tags":["upload","multipart","content-disposition"],"backgroundTag":"multipart-validation-failed","analyzedSha":"45b8ed5ab735f8a56bbb09a42384f030eb0208e7","analyzedAt":"2026-08-28T19:25:27.644Z","schemaVersion":2},"datasetVersion":"2026-08-28T21:17:43.275Z"}