From c5c601cffeb75dd31a06cfb6e1fe625e1695df96 Mon Sep 17 00:00:00 2001 From: MK13 Date: Sat, 11 Apr 2020 22:47:54 +0200 Subject: [PATCH] Bug fixes file upload and download --- .../de/financer/service/TransactionService.java | 5 ++++- financer-web-client/pom.xml | 5 +++++ .../de/financer/controller/FileController.java | 16 +++++++++++++++- .../controller/TransactionController.java | 3 ++- .../src/main/resources/static/changelog.txt | 4 ++++ 5 files changed, 30 insertions(+), 3 deletions(-) diff --git a/financer-server/src/main/java/de/financer/service/TransactionService.java b/financer-server/src/main/java/de/financer/service/TransactionService.java index ffb173b..ba6de63 100644 --- a/financer-server/src/main/java/de/financer/service/TransactionService.java +++ b/financer-server/src/main/java/de/financer/service/TransactionService.java @@ -80,7 +80,10 @@ public class TransactionService { buildTransaction(fromAccount, toAccount, amount, description, date, recurringTransaction, taxRelevant); transaction.setPeriods(getRelevantPeriods(transaction)); - transaction.setFiles(Collections.singleton(buildFile(fileName, fileContent))); + + if (StringUtils.isNotEmpty(fileName) && StringUtils.isNotEmpty(fileContent)) { + transaction.setFiles(Collections.singleton(buildFile(fileName, fileContent))); + } fromAccount.setCurrentBalance(fromAccount.getCurrentBalance() + (this.ruleService .getMultiplierFromAccount(fromAccount) * amount)); diff --git a/financer-web-client/pom.xml b/financer-web-client/pom.xml index f8cb964..e6c201b 100644 --- a/financer-web-client/pom.xml +++ b/financer-web-client/pom.xml @@ -54,6 +54,11 @@ jfreechart 1.5.0 + + org.overviewproject + mime-types + 0.1.3 + diff --git a/financer-web-client/src/main/java/de/financer/controller/FileController.java b/financer-web-client/src/main/java/de/financer/controller/FileController.java index 5d26b04..0e4fcfb 100644 --- a/financer-web-client/src/main/java/de/financer/controller/FileController.java +++ b/financer-web-client/src/main/java/de/financer/controller/FileController.java @@ -5,6 +5,8 @@ import de.financer.model.File; import de.financer.template.FinancerRestTemplate; import de.financer.template.exception.FinancerRestException; import de.financer.util.ControllerUtils; +import org.overviewproject.mime_types.GetBytesException; +import org.overviewproject.mime_types.MimeTypeDetector; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.Resource; @@ -36,8 +38,20 @@ public class FileController { return null; } + final byte[] decodedFileContent = Base64.getDecoder().decode(file.getContent()); + return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getName() + "\"") - .body(new ByteArrayResource(Base64.getDecoder().decode(file.getContent()))); + .header(HttpHeaders.CONTENT_TYPE, getMimeTypeForFile(file.getName(), decodedFileContent)) + .header(HttpHeaders.CONTENT_LENGTH, String.valueOf(decodedFileContent.length)) + .body(new ByteArrayResource(decodedFileContent)); + } + + private String getMimeTypeForFile(String fileName, byte[] content) { + try { + return new MimeTypeDetector().detectMimeType(fileName, () -> content); + } catch(GetBytesException e) { + return "text/html"; + } } } diff --git a/financer-web-client/src/main/java/de/financer/controller/TransactionController.java b/financer-web-client/src/main/java/de/financer/controller/TransactionController.java index 9c76853..c5b0f16 100644 --- a/financer-web-client/src/main/java/de/financer/controller/TransactionController.java +++ b/financer-web-client/src/main/java/de/financer/controller/TransactionController.java @@ -11,6 +11,7 @@ import de.financer.form.NewTransactionForm; import de.financer.model.Account; import de.financer.template.exception.FinancerRestException; import de.financer.util.ControllerUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.ParameterizedTypeReference; import org.springframework.stereotype.Controller; @@ -119,7 +120,7 @@ public class TransactionController { requestDto.setDescription(form.getDescription()); requestDto.setTaxRelevant(form.getTaxRelevant()); - if (form.getFile() != null) { + if (form.getFile() != null && StringUtils.isNotEmpty(form.getFile().getOriginalFilename())) { try { requestDto.setFileContent(Base64.getEncoder().encodeToString(form.getFile().getBytes())); requestDto.setFileName(form.getFile().getOriginalFilename()); diff --git a/financer-web-client/src/main/resources/static/changelog.txt b/financer-web-client/src/main/resources/static/changelog.txt index e82bf46..f9bf258 100644 --- a/financer-web-client/src/main/resources/static/changelog.txt +++ b/financer-web-client/src/main/resources/static/changelog.txt @@ -1,3 +1,7 @@ +v29 -> v30: +- Fix a bug in the file upload feature that caused every transaction to have a file, even though no file was uploaded +- Set proper HTTP headers for file download (mime type, length) + v28 -> v29: - Internal optimizations