diff --git a/arkindex/process/serializers/files.py b/arkindex/process/serializers/files.py
index 32efdb8c4d08eacfd96a3b4e6bbd584cc3b4dcf1..497aa2e5f5a57a7f25cead7153b48b1c0ad91ce0 100644
--- a/arkindex/process/serializers/files.py
+++ b/arkindex/process/serializers/files.py
@@ -71,6 +71,9 @@ class DataFileCreateSerializer(serializers.ModelSerializer):
             "s3_put_url",
         )
         read_only_fields = ("id", "status", "s3_url", "s3_put_url")
+        extra_kwargs = {
+            "size": {"error_messages": {"max_value": "File size exceeds maximum limit of 2GB."}}
+        }
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
diff --git a/arkindex/process/tests/test_datafile_api.py b/arkindex/process/tests/test_datafile_api.py
index 053f36a749aaacb0cd8eaf89cd13e5552c0e3eb2..2d673ad00c3c74a90b823e2a2494c9419301019b 100644
--- a/arkindex/process/tests/test_datafile_api.py
+++ b/arkindex/process/tests/test_datafile_api.py
@@ -74,6 +74,18 @@ class TestDataFileApi(FixtureAPITestCase):
             ["some text", 1, "http://s3/upload_put_url"]
         )
 
+    @patch("arkindex.project.aws.s3.meta.client.generate_presigned_url")
+    def test_create_datafile_size_exceeded(self, s3_presigned_url_mock):
+        self.client.force_login(self.user)
+        s3_presigned_url_mock.return_value = "http://s3/upload_put_url"
+        request = self.build_file_create_request(size=3147483647)
+        response = self.client.post(reverse("api:file-create"), request)
+        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
+        self.assertDictEqual(
+            response.json(),
+            {"size": ["File size exceeds maximum limit of 2GB."]}
+        )
+
     @patch("arkindex.project.aws.s3.Object")
     def test_check_uploaded_datafile(self, s3_object):
         s3_object().content_length = 42