diff --git a/moto/core/responses.py b/moto/core/responses.py index 54b575912..b6ae0270e 100644 --- a/moto/core/responses.py +++ b/moto/core/responses.py @@ -333,7 +333,8 @@ class BaseResponse(_TemplateEnvironmentMixin, ActionAuthenticatorMixin): self.body = k if hasattr(request, "files") and request.files: for _, value in request.files.items(): - self.body = value.stream + self.body = value.stream.read() + value.stream.close() if querystring.get("key"): filename = os.path.basename(request.files["file"].filename) querystring["key"] = [ diff --git a/tests/test_s3/test_s3_file_handles.py b/tests/test_s3/test_s3_file_handles.py index e5a6796ed..c1e6aacc8 100644 --- a/tests/test_s3/test_s3_file_handles.py +++ b/tests/test_s3/test_s3_file_handles.py @@ -5,6 +5,7 @@ from functools import wraps from unittest import SkipTest, TestCase import boto3 +import requests from moto import mock_aws, settings from moto.dynamodb.models import DynamoDBBackend @@ -311,6 +312,16 @@ class TestS3FileHandleClosuresUsingMocks(TestCase): self.s3_client.put_object(Bucket="foo", Key="bar", Body="stuff") self.s3_client.put_object(Bucket="foo", Key="bar", Body="stuff2") + @verify_zero_warnings + def test_upload_using_form(self): + with mock_aws(): + self.s3_client.create_bucket(Bucket="foo") + requests.post( + "https://foo.s3.amazonaws.com/", + data={"key": "test-key"}, + files={"file": ("tmp.txt", b"test content")}, + ) + def test_verify_key_can_be_copied_after_disposing(): # https://github.com/getmoto/moto/issues/5588