{"library":"streaming-form-data","title":"Streaming Form Data Parser","type":"library","description":"streaming-form-data is a Python library designed for parsing `multipart/form-data` HTTP requests in a streaming fashion, making it suitable for handling large file uploads and form submissions without loading the entire request body into memory. The current version is 2.0.0, and it follows an active maintenance release cadence, with major versions introducing significant changes.","language":"python","status":"active","last_verified":"Sun May 17","install":{"commands":["pip install streaming-form-data","pip install streaming-form-data[charset_detection]"],"cli":null},"imports":["from streaming_form_data import StreamingFormDataParser","from streaming_form_data.exceptions import ParseFailed","from streaming_form_data.targets import FileTarget","from streaming_form_data.targets import ValueTarget"],"auth":{"required":false,"env_vars":[]},"links":{"homepage":null,"github":"https://github.com/siddhantgoel/streaming-form-data","docs":"https://streaming-form-data.readthedocs.io","changelog":null,"pypi":"https://pypi.org/project/streaming-form-data/","npm":null,"openapi_spec":null,"status_page":null,"smithery":null},"quickstart":{"code":"import io\nfrom streaming_form_data import StreamingFormDataParser\nfrom streaming_form_data.targets import ValueTarget, FileTarget\n\n# Simulate an incoming HTTP request body and headers\nboundary = b'----WebKitFormBoundary7MA4YWxkTrZu0gW'\ncontent_type = b'multipart/form-data; boundary=' + boundary\npayload = (\n    b'--' + boundary + b'\\r\\n'\n    b'Content-Disposition: form-data; name=\"text_field\"\\r\\n'\n    b'\\r\\n'\n    b'Hello Streaming World!'\n    b'\\r\\n'\n    b'--' + boundary + b'\\r\\n'\n    b'Content-Disposition: form-data; name=\"file_upload\"; filename=\"message.txt\"\\r\\n'\n    b'Content-Type: text/plain\\r\\n'\n    b'\\r\\n'\n    b'This is a test file content.\\nLine two.\\n'\n    b'\\r\\n'\n    b'--' + boundary + b'--\\r\\n'\n)\n\nheaders = {b'Content-Type': content_type}\nparser = StreamingFormDataParser(headers=headers)\n\ntext_field = ValueTarget()\nfile_target = FileTarget(file_path='/tmp/uploaded_message.txt') # Path where the file will be saved\n\nparser.register('text_field', text_field)\nparser.register('file_upload', file_target)\n\n# In a real web application, `request.body` would be streamed here\n# For this example, we use a BytesIO object to simulate the stream\nstream = io.BytesIO(payload)\nwhile True:\n    chunk = stream.read(8192) # Read in chunks\n    if not chunk:\n        break\n    parser.data_received(chunk)\n\nprint(f\"Text field value: '{text_field.value.decode()}'\")\nprint(f\"File saved to: '{file_target.file_path}'\")\n\n# Verify content (optional, for demonstration)\nwith open(file_target.file_path, 'rb') as f:\n    print(f\"File content: '{f.read().decode()}'\")","lang":"python","description":"This quickstart demonstrates how to parse a `multipart/form-data` payload containing both a text field and a file upload. It simulates an incoming HTTP stream using `io.BytesIO`, registers `ValueTarget` for text fields and `FileTarget` for files, and processes the stream in chunks.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-17","installed_version":"1.20.0","pypi_latest":"2.0.0","is_stale":true,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":2.1,"avg_import_s":0.41,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"streaming-form-data","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.34,"mem_mb":9.4,"disk_size":"21.3M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"charset_detection","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.32,"mem_mb":9.4,"disk_size":"21.3M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"streaming-form-data","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.1,"import_time_s":0.21,"mem_mb":9.4,"disk_size":"22M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"charset_detection","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.2,"import_time_s":0.21,"mem_mb":9.4,"disk_size":"22M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"streaming-form-data","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.4,"mem_mb":10.7,"disk_size":"23.4M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"charset_detection","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.41,"mem_mb":10.7,"disk_size":"23.4M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"streaming-form-data","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2,"import_time_s":0.34,"mem_mb":10.7,"disk_size":"24M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"charset_detection","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.1,"import_time_s":0.34,"mem_mb":10.7,"disk_size":"24M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"streaming-form-data","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.63,"mem_mb":10.8,"disk_size":"15.3M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"charset_detection","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.6,"mem_mb":10.8,"disk_size":"15.3M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"streaming-form-data","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.8,"import_time_s":0.57,"mem_mb":10.8,"disk_size":"16M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"charset_detection","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.8,"import_time_s":0.57,"mem_mb":10.8,"disk_size":"16M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"streaming-form-data","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.6,"mem_mb":11.2,"disk_size":"15.0M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"charset_detection","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.61,"mem_mb":11.2,"disk_size":"15.0M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"streaming-form-data","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2,"import_time_s":0.56,"mem_mb":11.2,"disk_size":"16M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"charset_detection","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.8,"import_time_s":0.58,"mem_mb":11.2,"disk_size":"16M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"streaming-form-data","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.25,"mem_mb":8.6,"disk_size":"20.2M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"charset_detection","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.25,"mem_mb":8.6,"disk_size":"20.2M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"streaming-form-data","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.5,"import_time_s":0.22,"mem_mb":8.6,"disk_size":"21M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"charset_detection","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.5,"import_time_s":0.22,"mem_mb":8.6,"disk_size":"21M"}]}}