diff --git a/jams-react-client/src/components/CustomImgDropZone/CustomImgDropZone.tsx b/jams-react-client/src/components/CustomImgDropZone/CustomImgDropZone.tsx index f29c525b52b96e7c0b12eadb93c1bcd80fcd7a20..27fe93da0c6338836693b86e6981cdd1ca285d0e 100644 --- a/jams-react-client/src/components/CustomImgDropZone/CustomImgDropZone.tsx +++ b/jams-react-client/src/components/CustomImgDropZone/CustomImgDropZone.tsx @@ -1,6 +1,6 @@ -import React from "react"; +import React, { FC, MouseEventHandler } from "react"; import { makeStyles } from "@mui/styles"; -import Dropzone from "react-dropzone"; +import Dropzone, { Accept } from "react-dropzone"; import UploadIcon from "@mui/icons-material/CloudUpload"; import CloseIcon from "@mui/icons-material/Close"; @@ -32,12 +32,27 @@ const useStyles = makeStyles({ }, }); -function CustomImgDropZone(props) { - const { onDrop, accept, maxFiles, label, file, handleDelete, ...rest } = - props; +interface CustomImgDropZoneProps { + onDrop: (acceptedFiles: File[]) => void; + accept?: Accept; + maxFiles?: number; + label: string; + file: string; + handleDelete: MouseEventHandler<HTMLButtonElement>; +} + +const CustomImgDropZone: FC<CustomImgDropZoneProps> = ({ + onDrop, + accept, + maxFiles, + label, + file, + handleDelete, + ...rest +}) => { const classes = useStyles(); - const handleDrop = (acceptedFiles) => { + const handleDrop = (acceptedFiles: File[]) => { if (acceptedFiles.length > 0) { onDrop(acceptedFiles); } @@ -63,7 +78,7 @@ function CustomImgDropZone(props) { )} </Dropzone> ); -} +}; CustomImgDropZone.defaultProps = { accept: { "image/*": [".png", ".jpeg", ".jpg", ".svg"] }, diff --git a/jams-react-client/src/views/Blueprint/EditBlueprintUi.tsx b/jams-react-client/src/views/Blueprint/EditBlueprintUi.tsx index 1d62ef66cc1057f13b2bc3d9e12f3ac6cf2d0787..224adc197f10ac1be2f8eee2eb63aab9d7d6ecc9 100644 --- a/jams-react-client/src/views/Blueprint/EditBlueprintUi.tsx +++ b/jams-react-client/src/views/Blueprint/EditBlueprintUi.tsx @@ -14,12 +14,7 @@ import GridContainer from "components/Grid/GridContainer"; import { hexToRgb, blackColor } from "assets/jss/material-dashboard-react"; -import { - api_path_get_image, - api_path_post_image, - url_path, - url_port, -} from "../../globalUrls"; +import { api_path_post_image, url_path, url_port } from "../../globalUrls"; import dashboardStyle from "assets/jss/material-dashboard-react/views/dashboardStyle"; @@ -146,7 +141,7 @@ export default function EditBlueprintUi({ blueprintName }) { updatePolicyData("uiCustomization", newUiCustomization); }; - const handleImgDrop = (acceptedFiles: string[], imgType: string) => { + const handleImgDrop = (acceptedFiles: any[], imgType: string) => { const formData = new FormData(); formData.append("file", acceptedFiles[0]); @@ -156,8 +151,9 @@ export default function EditBlueprintUi({ blueprintName }) { method: "POST", body: formData, }) - .then(() => { - const newUrl = `${api_path_get_image}/${blueprintName}/${imgType}/${acceptedFiles[0].name}`; + .then((res) => res.json()) + .then((res) => { + const newUrl = res.url; if (imgType === "background") { handleUpdateUi({ diff --git a/jams-react-client/src/views/Blueprint/EditBlueprintUiForm.tsx b/jams-react-client/src/views/Blueprint/EditBlueprintUiForm.tsx index 524a7db5bc73bb21bad5c05f60913c79d6eb827a..457bcce39cdad7967799fe4e3a9fa396a607a9db 100644 --- a/jams-react-client/src/views/Blueprint/EditBlueprintUiForm.tsx +++ b/jams-react-client/src/views/Blueprint/EditBlueprintUiForm.tsx @@ -182,10 +182,6 @@ const CustomBackgroundForm = ({ handleImgDrop, bgFile, }) => { - const setBgFile = (value) => { - handleUpdateUi("bgFile", value); - }; - return ( <> <span> @@ -225,7 +221,6 @@ const CustomBackgroundForm = ({ .t("upload_an_image", "Upload an image") .toUpperCase()} file={bgFile} - setFile={setBgFile} handleDelete={(e) => { handleUpdateUi("backgroundUrl", ""); e.preventDefault(); @@ -316,10 +311,6 @@ const LogoForm = ({ handleUpdateUi, logoFile, }) => { - const setLogoFile = (value) => { - handleUpdateUi("logoFile", value); - }; - return ( <> <span> @@ -336,7 +327,6 @@ const LogoForm = ({ .t("upload_a_logotype", "Upload a logotype") .toUpperCase()} file={logoFile} - setFile={setLogoFile} handleDelete={(e) => { handleDeleteLogo(e); handleUpdateUi("logoUrl", null); diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/image/FileHandlerServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/image/FileHandlerServlet.java index 6ac7245f436a51f94bcb2412393f5d730904762e..b5358130560412b7ad54a73f796b87ab17717aa7 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/image/FileHandlerServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/image/FileHandlerServlet.java @@ -9,6 +9,7 @@ import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.Part; import lombok.extern.slf4j.Slf4j; +import net.jami.jams.common.serialization.adapters.GsonFactory; import java.io.File; import java.io.IOException; @@ -16,6 +17,10 @@ import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; + +import com.google.gson.Gson; @MultipartConfig @Slf4j @@ -23,18 +28,7 @@ import java.nio.file.Paths; public class FileHandlerServlet extends HttpServlet { private static final String IMAGES_DIR = "images"; - private static final String SAVE_DIR = - ".." - + File.separator - + ".." - + File.separator - + ".." - + File.separator - + ".." - + File.separator - + ".." - + File.separator - + IMAGES_DIR; + private static final String SAVE_DIR = "../../../../../" + IMAGES_DIR; /** * @apiVersion 1.0.0 @@ -76,44 +70,29 @@ public class FileHandlerServlet extends HttpServlet { File imagesFolder = new File(IMAGES_DIR + File.separator + blueprintName); if (!imagesFolder.exists()) { - imagesFolder.mkdirs(); - - File imagesFolderLogo = - new File( - IMAGES_DIR - + File.separator - + blueprintName - + File.separator - + "logo"); - File imagesFolderBackground = - new File( - IMAGES_DIR - + File.separator - + blueprintName - + File.separator - + "background"); - - imagesFolderLogo.mkdirs(); - imagesFolderBackground.mkdirs(); + Paths.get(IMAGES_DIR, blueprintName, "logo").toFile().mkdirs(); + Paths.get(IMAGES_DIR, blueprintName, "background").toFile().mkdirs(); } Part filePart = request.getPart("file"); // Retrieves <input type="file" name="file"> String fileName = filePart.getSubmittedFileName(); + String ext = fileName.substring(fileName.lastIndexOf(".") + 1); for (Part part : request.getParts()) { - part.write( - SAVE_DIR - + File.separator - + blueprintName - + File.separator - + imageType - + File.separator - + fileName); + long now = System.currentTimeMillis(); + fileName = now + "." + ext; + Path path = Paths.get(SAVE_DIR, blueprintName, imageType, fileName); + part.write(path.toString()); } + Map<String, String> map = new HashMap<>(); + String url = "/api/image/filehandler/" + blueprintName + "/" + imageType + "/" + fileName; + map.put("url", url); + + Gson gson = GsonFactory.createGson(); response.setStatus(HttpServletResponse.SC_OK); - response.getWriter().write("File upload was successful."); + response.getWriter().write(gson.toJson(map)); } catch (Exception e) { log.error("Error during file upload: " + e.getMessage()); response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); @@ -174,6 +153,7 @@ public class FileHandlerServlet extends HttpServlet { } response.setContentType(mimeType); + response.setHeader("Cache-Control", "public, max-age=31536000"); try (OutputStream out = response.getOutputStream()) { out.write(imageData);