diff --git a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java index 56831834c31..850ae32ec8e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java @@ -356,11 +356,13 @@ public boolean isUnlimitedUploadFileSize() { } public Long getMaxTotalUploadSizeInBytes() { - return maxTotalUploadSizeInBytes; + return uploadSessionQuota == null + ? maxTotalUploadSizeInBytes + : uploadSessionQuota.getRemainingQuotaInBytes(); } public String getHumanMaxTotalUploadSizeInBytes() { - return FileSizeChecker.bytesToHumanReadable(maxTotalUploadSizeInBytes); + return FileSizeChecker.bytesToHumanReadable(getMaxTotalUploadSizeInBytes()); } public boolean isStorageQuotaEnforced() { @@ -981,6 +983,8 @@ private void deleteFiles(List filesForDelete) { // removing it from the fileMetadatas lists (above), we also remove it from // the newFiles list and the dataset's files, so it never gets saved. + releaseUploadQuota(markedForDelete.getDataFile()); + FileMetadataUtil.removeDataFileFromList(dataset.getFiles(), markedForDelete.getDataFile()); FileMetadataUtil.removeDataFileFromList(newFiles, markedForDelete.getDataFile()); FileUtil.deleteTempFile(markedForDelete.getDataFile(), dataset, ingestService); @@ -1011,6 +1015,13 @@ private void deleteFiles(List filesForDelete) { } } + private void releaseUploadQuota(DataFile dataFile) { + if (uploadSessionQuota != null && dataFile.getFilesize() > 0) { + uploadSessionQuota.setTotalUsageInBytes(Math.max(0L, + uploadSessionQuota.getTotalUsageInBytes() - dataFile.getFilesize())); + } + } + /** * Save for File Replace operations * @@ -2190,6 +2201,22 @@ public void handleExternalUpload() { Optional.ofNullable(editDataFilesPageHelper.getHtmlErrorMessage(createDataFilesResult)).ifPresent(errorMessage -> errorMessages.add(errorMessage)); } catch (CommandException ex) { logger.log(Level.SEVERE, "Error during ingest of file {0}", new Object[]{fileName}); + + // Direct upload has already stored the file in S3. + // Remove it if Dataverse rejects the upload. + try { + sio.delete(); + } catch (IOException deleteEx) { + logger.log( + Level.WARNING, + "Failed to delete rejected direct upload {0}: {1}", + new Object[]{fileName, deleteEx.getMessage()} + ); + } + + // Show the actual command error to the user. + errorMessages.add(ex.getMessage()); + return; } if (datafiles == null) { diff --git a/src/main/webapp/editFilesFragment.xhtml b/src/main/webapp/editFilesFragment.xhtml index 8cc47f05f1c..84d96d0c300 100644 --- a/src/main/webapp/editFilesFragment.xhtml +++ b/src/main/webapp/editFilesFragment.xhtml @@ -138,6 +138,31 @@ $(fileUpload).prepend('
#{bundle['file.selectToAdd.dragdropMsg']}
'); } } + function checkUploadLimits(files, maxFileSize, remainingQuota) { + var fileUploadWidget = PF('fileUploadWidget'); + var totalSize = 0; + for (var i = 0; i < files.length; i++) { + if (maxFileSize !== null && files[i].size > maxFileSize) { + fileUploadWidget.clear(); + fileUploadWidget.showMessage({summary: '#{bundle["file.edit.error.file_exceeds_limit"]}'}); + fileUploadWidget.jq.find('.ui-messages-error-icon').remove(); + return false; + } + totalSize += files[i].size; + } + + if (remainingQuota !== null && totalSize > remainingQuota) { + var message = '#{bundle["file.addreplace.error.quota_exceeded"]}' + .replace('{0}', fileUploadWidget.formatSize(totalSize)) + .replace('{1}', fileUploadWidget.formatSize(remainingQuota)); + fileUploadWidget.clear(); + fileUploadWidget.showMessage({summary: message}); + fileUploadWidget.jq.find('.ui-messages-error-icon').remove(); + return false; + } + + return true; + } function dropBoxUploadFinished(fileupload) { $('button[id$="dropBoxUploadFinished"]').trigger('click'); } @@ -147,7 +172,7 @@ $(document).ready(function () { uploadWidgetDropMsg(); - #{useDirectUpload ? 'setupDirectUpload(true);':''} + setupDirectUpload(#{useDirectUpload}, #{empty EditDatafilesPage.maxFileUploadSizeInBytes ? 'null' : EditDatafilesPage.maxFileUploadSizeInBytes}, #{empty EditDatafilesPage.maxTotalUploadSizeInBytes ? 'null' : EditDatafilesPage.maxTotalUploadSizeInBytes}); }); //]]> @@ -348,9 +373,9 @@