From 95ed51951923bc3fa117f5054f68552697062108 Mon Sep 17 00:00:00 2001 From: Chaoran Chen Date: Sat, 20 Apr 2024 21:30:17 +0000 Subject: [PATCH 1/2] feat(website): show a meaningful error if uploaded file is too large --- backend/src/main/resources/application.properties | 4 ++-- website/src/components/Submission/DataUploadForm.tsx | 9 +++++++++ website/src/services/backendApi.ts | 9 ++++++++- website/src/services/commonApiTypes.ts | 7 +++++++ 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index ccbcd75229..e160eff6b7 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -6,8 +6,8 @@ springdoc.default-consumes-media-type=application/json springdoc.api-docs.path=/api-docs springdoc.swagger-ui.operationsSorter=alpha server.forward-headers-strategy=framework -spring.servlet.multipart.max-file-size=5000MB -spring.servlet.multipart.max-request-size=5000MB +spring.servlet.multipart.max-file-size=800MB +spring.servlet.multipart.max-request-size=800MB server.compression.enabled=true diff --git a/website/src/components/Submission/DataUploadForm.tsx b/website/src/components/Submission/DataUploadForm.tsx index 7f14daced1..fb6a46fd5d 100644 --- a/website/src/components/Submission/DataUploadForm.tsx +++ b/website/src/components/Submission/DataUploadForm.tsx @@ -37,6 +37,9 @@ type DataUploadFormProps = { const logger = getClientLogger('DataUploadForm'); +// This should be the same value as defined in the backend. +const MAX_UPLOAD_SIZE = '800 MB'; + const DataUseTerms = ({ dataUseTermsType, setDataUseTermsType, @@ -436,6 +439,12 @@ function handleError(onError: (message: string) => void, action: Action) { case 400: onError('Failed to submit sequence entries: ' + error.response.data.detail); return; + case 413: + onError( + `The uploaded file exceeds the maximum allowed size of ${MAX_UPLOAD_SIZE}. Please compress ` + + 'the file or split it into smaller submissions.', + ); + return; case 422: onError('The submitted file content was invalid: ' + error.response.data.detail); return; diff --git a/website/src/services/backendApi.ts b/website/src/services/backendApi.ts index d645fb8590..b84b3f9054 100644 --- a/website/src/services/backendApi.ts +++ b/website/src/services/backendApi.ts @@ -1,7 +1,12 @@ import { makeApi, makeEndpoint } from '@zodios/core'; import z from 'zod'; -import { authorizationHeader, notAuthorizedError, withOrganismPathSegment } from './commonApiTypes.ts'; +import { + authorizationHeader, + notAuthorizedError, + payloadTooLargeError, + withOrganismPathSegment, +} from './commonApiTypes.ts'; import { accessions, accessionVersion, @@ -37,6 +42,7 @@ const submitEndpoint = makeEndpoint({ { status: 400, schema: problemDetail }, { status: 422, schema: problemDetail }, notAuthorizedError, + payloadTooLargeError, ], }); @@ -59,6 +65,7 @@ const reviseEndpoint = makeEndpoint({ { status: 400, schema: problemDetail }, { status: 422, schema: problemDetail }, notAuthorizedError, + payloadTooLargeError, ], }); diff --git a/website/src/services/commonApiTypes.ts b/website/src/services/commonApiTypes.ts index f718ed8056..a5118bca7b 100644 --- a/website/src/services/commonApiTypes.ts +++ b/website/src/services/commonApiTypes.ts @@ -23,3 +23,10 @@ export const notAuthorizedError = makeErrors([ ])[0]; export const conflictError = { status: 409, schema: problemDetail }; + +export const payloadTooLargeError = makeErrors([ + { + status: 413, + schema: z.never(), + }, +])[0]; From f8ba9920c5b88a97a47944f435eeca8d7d0763bc Mon Sep 17 00:00:00 2001 From: Chaoran Chen Date: Sun, 21 Apr 2024 18:15:15 +0000 Subject: [PATCH 2/2] test --- backend/src/main/resources/application.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index e160eff6b7..639cdf030e 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -6,8 +6,8 @@ springdoc.default-consumes-media-type=application/json springdoc.api-docs.path=/api-docs springdoc.swagger-ui.operationsSorter=alpha server.forward-headers-strategy=framework -spring.servlet.multipart.max-file-size=800MB -spring.servlet.multipart.max-request-size=800MB +spring.servlet.multipart.max-file-size=200MB +spring.servlet.multipart.max-request-size=200MB server.compression.enabled=true