diff --git a/pom.xml b/pom.xml index c5c8dac..fe90131 100644 --- a/pom.xml +++ b/pom.xml @@ -87,6 +87,11 @@ org.springframework.boot spring-boot-starter-validation + + net.coobird + thumbnailator + 0.4.20 + diff --git a/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java b/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java index ca40266..d906e75 100644 --- a/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java +++ b/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java @@ -218,4 +218,18 @@ public class PhotoController { return "redirect:/photo/" + id; } + /* ========================== THUMBNAIL IMAGE ========================== */ + @GetMapping("/photo/{id}/thumb") + public ResponseEntity thumb(@PathVariable Long id) { + PhotoDTO photo = photoService.getPhotoById(id); + if (photo == null || photo.getUuidThumbnail() == null) + return ResponseEntity.notFound().build(); + Resource r = photoService.loadAsResource(photo.getUuidThumbnail()); + if (!r.exists()) + return ResponseEntity.notFound().build(); + return ResponseEntity.ok().contentType(MediaType.IMAGE_JPEG).body(r); + } + + + } \ No newline at end of file diff --git a/src/main/java/local/epul4a/fotosharing/dto/PhotoDTO.java b/src/main/java/local/epul4a/fotosharing/dto/PhotoDTO.java index fcb5d90..7333277 100644 --- a/src/main/java/local/epul4a/fotosharing/dto/PhotoDTO.java +++ b/src/main/java/local/epul4a/fotosharing/dto/PhotoDTO.java @@ -15,5 +15,6 @@ public class PhotoDTO { private LocalDateTime dateUpload; private String visibilite; private UtilisateurDTO proprietaire; + private String uuidThumbnail; } diff --git a/src/main/java/local/epul4a/fotosharing/mapper/PhotoMapper.java b/src/main/java/local/epul4a/fotosharing/mapper/PhotoMapper.java index a38cb75..9493b15 100644 --- a/src/main/java/local/epul4a/fotosharing/mapper/PhotoMapper.java +++ b/src/main/java/local/epul4a/fotosharing/mapper/PhotoMapper.java @@ -15,6 +15,7 @@ public class PhotoMapper { dto.setDateUpload(p.getDateUpload()); dto.setVisibilite(p.getVisibilite().name()); Utilisateur u = p.getProprietaire(); + dto.setUuidThumbnail(p.getUuidThumbnail()); if (u != null) { UtilisateurDTO uDTO = new UtilisateurDTO(); uDTO.setId(u.getId()); diff --git a/src/main/java/local/epul4a/fotosharing/model/Photo.java b/src/main/java/local/epul4a/fotosharing/model/Photo.java index e1ca2ab..ef6872a 100644 --- a/src/main/java/local/epul4a/fotosharing/model/Photo.java +++ b/src/main/java/local/epul4a/fotosharing/model/Photo.java @@ -34,4 +34,7 @@ public class Photo { @OneToMany(mappedBy = "photo", cascade = CascadeType.ALL, orphanRemoval = true) private Set partages = new HashSet<>(); + + @Column + private String uuidThumbnail; } diff --git a/src/main/java/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.java b/src/main/java/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.java index fac5d6e..b106a90 100644 --- a/src/main/java/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.java +++ b/src/main/java/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.java @@ -17,7 +17,9 @@ import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; +import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.InputStream; import java.net.MalformedURLException; import java.nio.file.*; import java.time.LocalDateTime; @@ -53,14 +55,27 @@ public class PhotoServiceImpl implements PhotoService { Path uploadPath = Paths.get(uploadDir); if (!Files.exists(uploadPath)) Files.createDirectories(uploadPath); - Files.copy(file.getInputStream(), - uploadPath.resolve(uuid), - StandardCopyOption.REPLACE_EXISTING); + // ========= LIRE LE FICHIER UNE SEULE FOIS ========= + byte[] bytes = file.getBytes(); + // ========= SAUVEGARDE ORIGINAL ========= + Path originalPath = uploadPath.resolve(uuid); + Files.write(originalPath, bytes); + // ========= MINIATURE ========= + String thumbUuid = "thumb-" + uuid + ".jpg"; + Path thumbPath = uploadPath.resolve(thumbUuid); + try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes)) { + net.coobird.thumbnailator.Thumbnails.of(bis) + .size(300, 300) + .outputFormat("jpg") + .toFile(thumbPath.toFile()); + } + // ========= BDD ========= Utilisateur owner = utilisateurRepository.findByEmail(ownerEmail) .orElseThrow(() -> new RuntimeException("Utilisateur introuvable")); Photo p = new Photo(); p.setNomFichierOriginal(original); p.setUuidFichier(uuid); + p.setUuidThumbnail(thumbUuid); p.setVisibilite(Photo.Visibilite.valueOf(visibilite)); p.setDateUpload(LocalDateTime.now()); p.setProprietaire(owner); @@ -72,6 +87,8 @@ public class PhotoServiceImpl implements PhotoService { + + //============= GET PHOTO BY ID ========================== @Override public PhotoDTO getPhotoById(Long id) { diff --git a/src/main/resources/templates/album-detail.html b/src/main/resources/templates/album-detail.html index 5bad9a3..df12e30 100644 --- a/src/main/resources/templates/album-detail.html +++ b/src/main/resources/templates/album-detail.html @@ -16,7 +16,7 @@

Photos dans l’album

- +
- diff --git a/src/main/resources/templates/mes-photos.html b/src/main/resources/templates/mes-photos.html index 765dd54..5dd31e9 100644 --- a/src/main/resources/templates/mes-photos.html +++ b/src/main/resources/templates/mes-photos.html @@ -12,7 +12,7 @@
- +
@@ -28,7 +28,7 @@
- +
@@ -44,7 +44,7 @@
- @@ -78,7 +78,7 @@ - +
diff --git a/target/classes/local/epul4a/fotosharing/controller/PhotoController.class b/target/classes/local/epul4a/fotosharing/controller/PhotoController.class index f64ea31..1e55b35 100644 Binary files a/target/classes/local/epul4a/fotosharing/controller/PhotoController.class and b/target/classes/local/epul4a/fotosharing/controller/PhotoController.class differ diff --git a/target/classes/local/epul4a/fotosharing/dto/PhotoDTO.class b/target/classes/local/epul4a/fotosharing/dto/PhotoDTO.class index d977d06..0a4c395 100644 Binary files a/target/classes/local/epul4a/fotosharing/dto/PhotoDTO.class and b/target/classes/local/epul4a/fotosharing/dto/PhotoDTO.class differ diff --git a/target/classes/local/epul4a/fotosharing/mapper/PhotoMapper.class b/target/classes/local/epul4a/fotosharing/mapper/PhotoMapper.class index 4c56109..a895408 100644 Binary files a/target/classes/local/epul4a/fotosharing/mapper/PhotoMapper.class and b/target/classes/local/epul4a/fotosharing/mapper/PhotoMapper.class differ diff --git a/target/classes/local/epul4a/fotosharing/model/Photo.class b/target/classes/local/epul4a/fotosharing/model/Photo.class index 5d75641..5b34ff3 100644 Binary files a/target/classes/local/epul4a/fotosharing/model/Photo.class and b/target/classes/local/epul4a/fotosharing/model/Photo.class differ diff --git a/target/classes/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.class b/target/classes/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.class index 934d9ef..5d7f3ea 100644 Binary files a/target/classes/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.class and b/target/classes/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.class differ diff --git a/target/classes/templates/album-detail.html b/target/classes/templates/album-detail.html index 5bad9a3..df12e30 100644 --- a/target/classes/templates/album-detail.html +++ b/target/classes/templates/album-detail.html @@ -16,7 +16,7 @@

Photos dans l’album

- +
- diff --git a/target/classes/templates/mes-photos.html b/target/classes/templates/mes-photos.html index 765dd54..5dd31e9 100644 --- a/target/classes/templates/mes-photos.html +++ b/target/classes/templates/mes-photos.html @@ -12,7 +12,7 @@
@@ -28,7 +28,7 @@
@@ -44,7 +44,7 @@
- @@ -78,7 +78,7 @@ - +