diff --git a/app/assets/javascripts/repository/components/upload_blob_modal.vue b/app/assets/javascripts/repository/components/upload_blob_modal.vue
index 01089652eae..e0b7714f62f 100644
--- a/app/assets/javascripts/repository/components/upload_blob_modal.vue
+++ b/app/assets/javascripts/repository/components/upload_blob_modal.vue
@@ -21,6 +21,9 @@ export default {
i18n: {
REMOVE_FILE_TEXT: __('Remove file'),
ERROR_MESSAGE: __('Error uploading file. Please try again.'),
+ DIRECTORY_FILE_ERROR: __(
+ 'Directories cannot be uploaded. Please upload a single file instead.',
+ ),
},
props: {
modalId: {
@@ -67,6 +70,7 @@ export default {
file: null,
filePreviewURL: null,
loading: false,
+ hasDirectoryUploadError: false,
};
},
computed: {
@@ -90,6 +94,22 @@ export default {
fileUurlReader.onload = (e) => {
this.filePreviewURL = e.target?.result;
+ this.hasDirectoryUploadError = false;
+ };
+
+ fileUurlReader.onerror = (e) => {
+ const error = e.target?.error;
+
+ // eslint-disable-next-line no-extra-boolean-cast
+ if (!Boolean(this.file?.type)) {
+ this.file = null;
+ this.hasDirectoryUploadError = true;
+ }
+
+ logError(
+ `Failed to ${this.replacePath ? 'replace' : 'upload'} file. See exception details for more information.`,
+ error,
+ );
};
},
removeFile() {
@@ -141,6 +161,9 @@ export default {
return this.submitRequest('post', uploadPath, formData);
},
+ handleModalClose() {
+ this.hasDirectoryUploadError = false;
+ },
},
validFileMimetypes: [],
};
@@ -158,14 +181,16 @@ export default {
:loading="loading"
:empty-repo="emptyRepo"
data-testid="upload-blob-modal"
+ @close-commit-changes-modal="handleModalClose"
@submit-form="submitForm"
>
+
+ {{ $options.i18n.DIRECTORY_FILE_ERROR }}
+
diff --git a/app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue b/app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue
index 9ca4b443828..619ddcab74f 100644
--- a/app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue
+++ b/app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue
@@ -86,6 +86,11 @@ export default {
required: false,
default: false,
},
+ hasUploadError: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
data() {
return {
@@ -208,7 +213,8 @@ export default {
>