{"record":{"id":"1eeaeb25f28acf00","repo":"aio-libs/aiohttp","slug":"multipart-field-missing-name","errorCode":null,"errorMessage":"Multipart field missing name.","messagePattern":"Multipart field missing name\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"aiohttp/web_request.py","lineNumber":749,"sourceCode":"            \"application/x-www-form-urlencoded\",\n            \"multipart/form-data\",\n        ):\n            self._post = MultiDictProxy(MultiDict())\n            return self._post\n\n        out: MultiDict[str | bytes | FileField] = MultiDict()\n\n        if content_type == \"multipart/form-data\":\n            multipart = await self.multipart()\n            max_size = self._client_max_size\n\n            size = 0\n            while (field := await multipart.next()) is not None:\n                field_ct = field.headers.get(hdrs.CONTENT_TYPE)\n\n                if isinstance(field, BodyPartReader):\n                    if field.name is None:\n                        raise ValueError(\"Multipart field missing name.\")\n\n                    # Note that according to RFC 7578, the Content-Type header\n                    # is optional, even for files, so we can't assume it's\n                    # present.\n                    # https://tools.ietf.org/html/rfc7578#section-4.4\n                    if field.filename:\n                        # store file in temp file\n                        tmp = await self._loop.run_in_executor(\n                            None, tempfile.TemporaryFile\n                        )\n                        while chunk := await field.read_chunk(size=DEFAULT_CHUNK_SIZE):\n                            async for decoded_chunk in field.decode_iter(chunk):\n                                await self._loop.run_in_executor(\n                                    None, tmp.write, decoded_chunk\n                                )\n                                size += len(decoded_chunk)\n                                if 0 < max_size < size:\n                                    await self._loop.run_in_executor(None, tmp.close)","sourceCodeStart":731,"sourceCodeEnd":767,"githubUrl":"https://github.com/aio-libs/aiohttp/blob/d041d4d0fd48c3f0832084d33be16cf1c4835f85/aiohttp/web_request.py#L731-L767","documentation":"While parsing multipart/form-data in BaseRequest.post(), each BodyPartReader field must carry a name (from Content-Disposition: name=). If field.name is None the part is anonymous and aiohttp raises ValueError('Multipart field missing name.'), since form fields are keyed by name.","triggerScenarios":"A multipart part whose Content-Disposition header omits the name parameter; a file part with only filename= and no name=.","commonSituations":"Malformed clients; custom multipart builders omitting name; buggy HTTP libraries generating parts without Content-Disposition name.","solutions":["Catch ValueError in the handler around await request.post() and return 400.","Validate Content-Disposition before parsing multipart.","Use request.multipart() directly to inspect anonymous parts yourself."],"exampleFix":"try:\n    data = await request.post()\nexcept ValueError:\n    raise web.HTTPBadRequest(text='malformed multipart: missing field name')","handlingStrategy":"try-catch","validationCode":"reader = await request.multipart()\nasync for part in reader:\n    if getattr(part, 'name', None) is None:\n        raise web.HTTPBadRequest(text='multipart field missing name')","typeGuard":null,"tryCatchPattern":"try:\n    data = await request.post()\nexcept ValueError:\n    raise web.HTTPBadRequest(text='malformed multipart payload')","preventionTips":["Catch ValueError around await request.post().","Validate Content-Disposition: name= on every part yourself.","Use request.multipart() directly to control parsing."],"tags":["multipart","form-data","validation","upload"],"backgroundTag":null,"analyzedSha":"d041d4d0fd48c3f0832084d33be16cf1c4835f85","analyzedAt":"2026-08-11T20:44:15.550Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}