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