diff --git a/data/demo.mv.db b/data/demo.mv.db index ffd29e5632ef9a131d2e65647c27ed4f451be013..c687424bbc764ff63cdef9e93a82885258976e41 100644 Binary files a/data/demo.mv.db and b/data/demo.mv.db differ diff --git a/src/main/java/com/dre0059/articleprocessor/controller/FileUploadController.java b/src/main/java/com/dre0059/articleprocessor/controller/FileUploadController.java index 8d463d729a1e739546dd0ae2fbca8dc3c55cb983..9bc0176c9188bc9a1ca3e1358126f82c8b3d0f3a 100644 --- a/src/main/java/com/dre0059/articleprocessor/controller/FileUploadController.java +++ b/src/main/java/com/dre0059/articleprocessor/controller/FileUploadController.java @@ -22,6 +22,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MaxUploadSizeExceededException; +import org.springframework.web.bind.annotation.ExceptionHandler; @Controller @RequestMapping @@ -31,7 +33,6 @@ public class FileUploadController { private final ReferenceService referenceService; private final CategoryService categoryService; - public FileUploadController(GrobidClient grobidClient, HeaderService headerService, ReferenceService referenceService, CategoryService categoryService) { this.grobidClient = grobidClient; this.headerService = headerService; @@ -54,7 +55,13 @@ public class FileUploadController { @RequestParam("tags") List<String> tags) { if (file.isEmpty()) { - return ResponseEntity.badRequest().body("No file uploaded!"); + return ResponseEntity.badRequest().body(Map.of("error", "No file uploaded!")); + } + + // Pridáme kontrolu veÄľkosti ešte pred spracovanĂm + final long maxFileSizeBytes = 5 * 1024 * 1024; // 5 MB + if (file.getSize() > maxFileSizeBytes) { + return ResponseEntity.badRequest().body(Map.of("error", "Uploaded PDF is too large. Maximum allowed size is 5MB.")); } try { @@ -64,10 +71,9 @@ public class FileUploadController { // save data from file to tmpFile try(FileOutputStream stream = new FileOutputStream(tmpFile)) { stream.write(file.getBytes()); - } catch (IOException e) { - return ResponseEntity.internalServerError().body("FAILURE - cannot process file : " + e.getMessage()); + } catch (IOException e) { + return ResponseEntity.internalServerError().body(Map.of("error", "FAILURE - cannot process file : " + e.getMessage())); } - //System.out.println("File written to temporary location. "); String header; try { @@ -79,15 +85,11 @@ public class FileUploadController { } return ResponseEntity.internalServerError().body(Map.of("error", "GROBID processing error")); } - //System.out.println("GROBID Header processed: " + header); String references = grobidClient.processReferences(tmpFile); - //System.out.println("GROBID Reference processed: " + references); Dokument savedDocument = headerService.processHeader(header, categoryId, tags, tmpFile); - //System.out.println("Header saved to database."); - // dokument already exists if(savedDocument == null) { if (tmpFile.exists()) tmpFile.delete(); return ResponseEntity.status(HttpStatus.CONFLICT) @@ -95,7 +97,6 @@ public class FileUploadController { } referenceService.extractReferences(references); - //System.out.println("References extracted.."); if (tmpFile.exists()) tmpFile.delete(); @@ -105,14 +106,15 @@ public class FileUploadController { return ResponseEntity.ok(response); - } catch (IOException e) { - return ResponseEntity.status(500).body("Chyba pri vytváranĂ doÄŤasnĂ©ho sĂşboru."); + return ResponseEntity.status(500).body(Map.of("error", "Chyba pri vytváranĂ doÄŤasnĂ©ho sĂşboru.")); } } - + // Globálny handler pre veÄľkĂ© sĂşbory + @ExceptionHandler(MaxUploadSizeExceededException.class) + @ResponseBody + public ResponseEntity<?> handleMaxSizeException(MaxUploadSizeExceededException exc) { + return ResponseEntity.badRequest().body(Map.of("error", "Uploaded PDF is too large. Maximum allowed size is 5MB.")); + } } - - - diff --git a/src/main/java/com/dre0059/articleprocessor/model/Dokument.java b/src/main/java/com/dre0059/articleprocessor/model/Dokument.java index 8ae038251bcfe81919d40aaeac554870fd76be64..d7ab3ffea0bd75d449d05699844062218797ed62 100644 --- a/src/main/java/com/dre0059/articleprocessor/model/Dokument.java +++ b/src/main/java/com/dre0059/articleprocessor/model/Dokument.java @@ -110,7 +110,7 @@ public class Dokument { StringBuilder builder = new StringBuilder(); for(Tag tag : tags){ - builder.append(tag.getTitle() + " "); + builder.append(tag.getTitle() + ", "); } return builder.toString(); diff --git a/src/main/resources/templates/upload.html b/src/main/resources/templates/upload.html index c263d6d2f0b93fb1402a6328d77c29337544e52a..7b640cb7e7510b67bd788f87cec55a52beb1860f 100644 --- a/src/main/resources/templates/upload.html +++ b/src/main/resources/templates/upload.html @@ -121,19 +121,35 @@ // NáhÄľad PDF sĂşboru document.getElementById('fileInput').addEventListener('change', function(event) { const file = event.target.files[0]; - if (file && file.type === 'application/pdf') { - const fileURL = URL.createObjectURL(file); - const preview = document.getElementById('pdf-preview'); - preview.src = fileURL; - preview.style.display = 'block'; - - document.getElementById('upload-button-wrapper').style.display = 'block'; - preview.scrollIntoView({ behavior: 'smooth', block: 'start' }); - } else { - alert('Please, choose a valid PDF file.'); + if (file) { + // kontrola veÄľkosti + const maxSizeMB = 5; + const maxSizeBytes = maxSizeMB * 1024 * 1024; + + if (file.size > maxSizeBytes) { + showAlert(`Uploaded PDF is too large. Maximum allowed size is ${maxSizeMB}MB.`, 'danger'); + this.value = ''; // vyprázdni input + document.getElementById('pdf-preview').style.display = 'none'; + document.getElementById('upload-button-wrapper').style.display = 'none'; + return; + } + + if (file.type === 'application/pdf') { + const fileURL = URL.createObjectURL(file); + const preview = document.getElementById('pdf-preview'); + preview.src = fileURL; + preview.style.display = 'block'; + + document.getElementById('upload-button-wrapper').style.display = 'block'; + preview.scrollIntoView({ behavior: 'smooth', block: 'start' }); + } else { + alert('Please, choose a valid PDF file.'); + } } }); + + // Inicializácia SELECT2 pre tagy $(document).ready(function() { $('#tags').select2({