From d26d3742c5ae82594cd3d88284d8c75c15a605c2 Mon Sep 17 00:00:00 2001 From: Subivas Date: Wed, 3 Dec 2025 13:59:26 +0100 Subject: [PATCH] FEAT : Gestion des miniatures via thumbnails --- pom.xml | 5 ++++ .../controller/PhotoController.java | 14 +++++++++++ .../epul4a/fotosharing/dto/PhotoDTO.java | 1 + .../fotosharing/mapper/PhotoMapper.java | 1 + .../local/epul4a/fotosharing/model/Photo.java | 3 +++ .../service/impl/PhotoServiceImpl.java | 23 +++++++++++++++--- .../resources/templates/album-detail.html | 2 +- src/main/resources/templates/galerie.html | 2 +- src/main/resources/templates/mes-photos.html | 8 +++--- .../controller/PhotoController.class | Bin 10974 -> 11295 bytes .../epul4a/fotosharing/dto/PhotoDTO.class | Bin 2140 -> 2380 bytes .../fotosharing/mapper/PhotoMapper.class | Bin 1997 -> 2067 bytes .../epul4a/fotosharing/model/Photo.class | Bin 4118 -> 4401 bytes .../service/impl/PhotoServiceImpl.class | Bin 10780 -> 11714 bytes target/classes/templates/album-detail.html | 2 +- target/classes/templates/galerie.html | 2 +- target/classes/templates/mes-photos.html | 8 +++--- 17 files changed, 56 insertions(+), 15 deletions(-) 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 f64ea31f215e7331c7f142ac389285f5e8233a90..1e55b3536f975c5511733937dcc8186c72f97e2d 100644 GIT binary patch delta 2462 zcmai$Yiv_x7{~uluUp%#TY;@>yS8H+r5js;!MIE=^TKq1W5T%K27|H5O}8O}SRh0b zLeO~RgNac;88OB%(S{j8{Q?Qm_(>8>bl~liAHbN%keR{$)M6QiE9{%BlK*1v1GXJnvn&7P5cJNEYu?De1nfBA41e;cp) z<8Be3*u-vp=AY(uipwo-pA<>)#XJ5NilpP>;b4m`3~^vP55^u@Y}Q%Z+DG9riE@{A8R<*+fY`ZvchLA~)+ zq}n)MT}05dAgX_kMCW=-AaIHYHt`xCMH|Iu+>XZlCDdXLoVx zy!kmMaa3}Mlq0UT({AEn!n-|Cb%8gV_;_{csTNUZ`pn1bOzsSDrj!Rv;+VV%G9*)I zRY)Zq`ndCOa5s=__z-SmEH;~Tzr@06b<$!!sYF16Ql&YQ=9y}>ge0urlaz>5!=~q= z5`$e^ajD_?Q)!c|$IbPoXA&Y(gd@rk=g8sJ=JBMC+Zy8z&eW^fA#PHpO_>pyHY5oy z;9i+7N$Tn~M&p}ET~d?M)D83q=(Jcnr9m3W>ctXVkQrp1hB|4IX4o}hDQpu6y3sL# zm>a7!sZ*qZZ%FYVo6NK*^CHgDlx~JXW^0xfnFEIk@a39c3G@Ec6Xer^w@fIzGKQ2m4l^o*|r zg(yN28JwY2j0JcbXK8uRiF0_FmKUpW2CqmPd{Smysjb+2ul{+@9?+i6V%)U+lzY+t zo1~#r@5y47RmRM^`DvAv0qshf5}aTjokSf@=?pa^l(0le$darm3GJ+nJ3@Fz<}pIb zQI*l=%tFqnOe(g?6239ck;|aG2TSQem|1TtgG}%0Y;q!n7v&+cy08ITa9xE6{piAFd6;1tK|4ODRcv`; zu73nBnVRN-0oW%nS*KsS8%LJ9Wm&FRR0=9L3xie3gv`78s60l$SQni-Y89$z%zRX( zqhrTcP`w-@kfFnQc1T{P*( zgi_&Y)=*aK+33ctLN!|n*j)gr)XYOZq18-Ua!x6fle<_D8XCXjj%L0*y|zHUFIZ<^ zYWd=tC15cJEarg8oJ(RAVa1daEFam`TCft8!)8Fu>l#xnVjQF{><`AaWK99XO@1@J z(F_Hj7EK+p7($kAAxpPVR<~@M&T-vetDb_)Tgw;RPb*n#Hfb)o$|O^n*R4J^jbmuF zVdadg@XW~I&uj2q!oo2u6nd8n;QW^vMvP?AF&k`Z_4ja!rVE?P!xDu3~KG{iv&0o|EV0II8{u DWP}-h delta 2223 zcmah~S!`5Q82-OI)44O#=}bFVIx`(QQ(8Jq3oTI8uu~Tb1p&pfRS;zdwUtu$q|p$K z1{?80;sXJmj2a)Pn2C_M;DaVaAAHaR6CEB*Onh)5hQtKX@BDXqdyN<;Irsi^?peO& zKmR$s`TPFpr5hJM5|Jf%Zag}cz;&mT$lG!wCVxSk?-Fg*76LYcF;pRRE?)a$7@;mrF#+YQ9wQnL#yT&dOZJ zXbu0>1*Mv=1ltt01~worc{82yY%T`A1IhGRzAQxe3~5(4%$jC5el}}zrdcM=1!~#q z1_Z-MGMa*0B&f^1EkVu}DYm~awsSQ%Z`7C*@;Yvn7;fW2%s}VmmTt|wbV!b~ z>m=JLwlid49Pt}6nMMng>s&gihR}e8{~vNy(tH<-D%tlc2^wMrXQXwOW?oYNk5ZuL znPo3Xs~pj+bNwrLk`=JHB3VJDus9RY{k;gyqB< zk}a}LE~$ZgWu1J89vV0zJ#vvz#AD))ze7UEIbXHa58OF%a!fuNR(_uvn4Ob8-HjEb z!9&ukhD|jm$W2ajj?^|nq*`BNr84a)6xE5SvKW^-dC%uS%Hy2!IH$0xa@tcaXGK>N z(9^Q2f^MP^878in#pq1TrbAG02QLX$5_RzCGgQC3UQJ$foS zJ#d{KxK2GE#*j{|B}`*Tr^56~(N0+KpTVt}pG$G-nx$9NJ8k4oIr|$D!S3jZ{ zqAsi#&Kt#MABM|R@>|8=yMPpR#>0^Dbjx_UWh%N=%Ju}V39bGu)qOsxM!CVwwW_tu z)l3fNe%sChU_8op%qqzryp`(A`@H;V$p>=cJP?pgw|p*5G$y|A z1NfngGusDx$A*?Sx1GJ6-_HDJ=KA;F?>_*r1Mi~{f}scu8xV#O1{3Gjg=N~7Q!$T= z=e#5tjBE=>$Xy0QnQUPUMqw-hQ3J-oV6bGnCCfH>y=iY)<`-AGjjH7d^e#)+JgMTw ze*Tz2NR*MCyM*Ulr?N$`xB&^6V32g&+JPul1^13UQ4x-1<7SV?sU)uQNg6OkKI6@% zD7T%6l`>!kZZU|KEy>U7wrk<7b1jAxHE!l8+I@VPM@ymR47g3G=!IyAqOgVJM4C5X z0q!s`>YiKo1eccZID^&PwfUY&1T+xe^e}71ziYrf;>Re|e6?9CI+no9hCjGv1SWFA z;YYa3y}VVlaVM!_ETD*Fw>O7nRWukpzW(}-+*=I76)q1k`D7;BBcT$VLHcvkAvq2m zm9)+G9LJTG6t07pB=M43(fw+ET2#WUwt)U)QQ=1Ng5`97I+K6U@pozYqr|?V@Q91~k>qwwzXQ9v j=+lGZ=|j`SFI>UD)knWLD4xDwT|627=-**Wg<$VLJWGH% literal 2140 zcmb7^YflqF6o$_fN~P=;C=|hh;st3zSX8`mF(DERNd+R%@7s242e-S;c9!3ziN?ea z{s4cJ@ty63?y{lf%TCYCyw99#|Ni^^hlqA*H%T!XO3<)IaT;MXabaGXhGp7S$ zixexP(G1;Xl&qMNpEoSW#H({Hh7@&f6qL97I6Q;pqvkZar%=gD(G(?N3CR^{UZVxN z&q!;yPQw*kn!@Fb)(SVqdoBTJ0`IwqdYjSk2d4trctP0w$g7vQduEm_?4*59ib$2R z+nd9(CYp?vZ+@hcRN&)PE)Nl6I+yQBl%HBg+0UM>f&6x0Cv8M;DR&*6m_9>&Oz+CxLVu z(BCfM@n$O{Q@L$liA*+KE@f1!(CxQ5?G&11Cl9~a7Fh5!Hn diff --git a/target/classes/local/epul4a/fotosharing/mapper/PhotoMapper.class b/target/classes/local/epul4a/fotosharing/mapper/PhotoMapper.class index 4c56109afc4dd1f7a8144213c831161f796729d0..a8954081434573d48f06afa8a736952e9993fc00 100644 GIT binary patch delta 568 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 delta 3729 zcmb_f33Qaz75?sQ|DTzcnMo#)Ovo}22!Vth0)#a{fKb4g01{BhKn55HNytptf({5# zk=^Hl5L8saT^1WMp$b^2mbO&8s4W&mYxl+OmR9h-e}-`Ma1N*EG$-MI@BZ)I_ucQi z_x_JJ=eEqSpS#-r27pm??1;U}n&Mm>2$$B@H-;<14FUghLTX+w`H`)YTx(qx8DCew z=C=B9u&y=%ek{tU`?Q3Mc7|k?Qf{Qv7X>AFDaW^JicUp z$?VdK8Ku)F5xPyi)wU6Klwz^K5(EhreIcJun3QJ#+F|LQdEF8Z#p7|vGEwY&8qa8WR^R{*67u;~x{QkD>CX{72B|gv+Qt1!Rxb<~ za%p%$j!n!iIE0r3UPcdsopqiT2!;HM1IaMqRe>Vp+wnY(2v~7cadBGn$elii+^akF z7Q80#O|;7P#9_J_Z30oW%PWZmdKljlcpY!ZzRuApVVn{;tz%zV zX9+#!E=rLjUAjEyblKh#cpKl9mz4WqZdj-9>d}NQs7hkO3rfc5%>*$tKoMls^3e$DOFx{yJb$& zl#FKlQQ%Mbn4p!Fm(D7lQQ|-gJ`?y0{wg;oop#~x_=kpn3j7P76NYpMR!2#4d-6De zEBKFw{|bD8tMbF-BDW1~4k9vXWai_@B6B@==o;AsX{5_$Pk~Nk7vvxzqn=5LI@#26 zmmoKLOiann!4>idN}*0%9--h`E=6-*uTnduQkq6yLFv>*PEPS9@VZPvS(GhTq~usQ zbMq7>&eG-eHFok*4hult<++scSe2)M*o^KuJS`^4M5kQ|GVt75T`Gr(8DdcjKT=o8|jixwJ)I z&B{#LW~c46L!+I7b`cj;E}xkz%d>}B9wwB@0hwLoXF`*Qv-{Jd@^W^U{=3y_j|*y` zkefm-8?`9IK0&oq=cYO~JY}c-^t49La5d1gvcPxNdC*RW=sAs^7xV(XcBUnTUAyL_p#&gZmgbcB!EQ9o|74u1CMzX2f{h-97$ zHYURbxAF8Kg`bHa7Gn@hG+4gftw;V4wsq$E0D7{!JS3nOoahY?@~M!mz1a$+&`=sC z({j4z4d+>+nVo|jgO`C%ETR$0ArCLY#x8&h(w{Rc;9_5 z2O$fC(Fa4gKNVskhN29^FbBgCvK-aGkE`%#Y%j66LrOK&>TD~~G~>+MsLaT^tGT|&naYAFzC(P_x#^qXOlhpG{Zn9>paN@e?!JBZ}cDer>`Ha$`lf zgmWaw1-KMxeBa3Ai^+{5%<4dwMYE~WpdpL9b0uT9A&utHTs~ZJo?xQcEHl?T-N{oE z-Nm8Iqxo@c8zT%&m3-HXOa@nEF|n&Zw+?gb+DArO6VN!DyB4v%js_>*7@JWlwM=SId#xZRz?-2gm|IFjfv_t z+oI$o6j?GdmlRq%Su?9RN=hcQQRhON*V4(_$rhyyGq_uluhOd-0>;-gAE$0ApJGj} zuhFA7b4z-V+uas!Ok26VZ{yu5#;C{A~lYbW~@DQpX4RXq3;5(FD)uH674kcH` zl^l)XR80X^XFLYeB2Ggq`|3`Md1PacskDUOY7}Hhszb!qFXi=B5#!}jei`phH_w4( z*Jt^ zf-VEqm(FHX;daB3FvfPOrxm0^nv@tx)Rw#bcbTfed`%-^c7ZR3lT+Qy!8 zxZ9~8hw9WG%IChVq9fz85d$%jD}EK*Otjj#t+18W@RGG`n~DT_lIKlyU=EXbH$~`P z!?2MK@VuGsqx+5d1IE7(#;sdP8ly+(G1?O!?WHH^C3dO)+tG|BdU>puUZKNu6y7fZ DW&yvw 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 @@ - +