Creating API to Upload Images in SUSI.AI Server
SUSI Server needed to have an API where users can upload and store images. This images will be useful in setting custom theme for the botbuilder or for chat.susi.ai. User can upload image from their systems instead of pasting the link of an image stored in cloud. This blog explains how the SUSI Server stores the images in its local storage. Creating Upload Image Service UploadImageService.java is the file which creates the API to upload image. After creating the UploadImageService class in this file, we need to include the class in SusiServer.java to enable the API: // add services services = new Class[]{ ... UploadImageService.class Restricting access rights and giving API endpoint name The Upload Image API should be available only to logged in users and not to anonymous users. Therefore we need to set the base user role to “USER”. Also we need to set the name of the API endpoint. Lets set it to “/cms/uploadImage.json”. @Override public UserRole getMinimalUserRole() { return UserRole.USER; } @Override public String getAPIPath() { return "/cms/uploadImage.json"; } Creating API to accept the Post request We need to accept the image uploaded by the client in a post request. The post request will contain the following parameters: access_token - used to verify identity of the user and get their UUID image_name - the name of the image image (the image file) - the actual image file To accept the post request on this route, we define the following function: @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setHeader("Access-Control-Allow-Origin", "*"); // enable CORS JSONObject json = new JSONObject(); Part imagePart = req.getPart("image"); if (req.getParameter("access_token") != null) { if (imagePart == null) { json.put("accepted", false); json.put("message", "Image not given"); } else { // save image Getting the correct storage location We are saving the image in the local storage of the server, i.e inside the “data” folder. Inside it, we store inside the “image_uploads” folder. The image path and name has three parts: User’s UUID as the sub folder’s name System time in milliseconds as the first part of the image’s name The image’s name given by the user as the second part of the image’s name String image_name = req.getParameter("image_name"); ClientCredential credential = new ClientCredential(ClientCredential.Type.access_token, req.getParameter("access_token")); Authentication authentication = DAO.getAuthentication(credential); ClientIdentity identity = authentication.getIdentity(); String userId = identity.getUuid(); String imagePath = DAO.data_dir + File.separator + "image_uploads" + File.separator + userId; Saving the image After we have formed the location of the image to be stored, we need to actually write that file to the local storage. Here is the code snippet which does that: // Reading content for image Image image = ImageIO.read(imagePartContent); BufferedImage bi = this.toBufferedImage(image); // Checks if images directory exists or not. If not then create one if (!Files.exists(Paths.get(imagePath))) new File(imagePath).mkdirs(); String new_image_name = System.currentTimeMillis() + "_" + image_name; File p = new File(imagePath + File.separator + new_image_name); if (p.exists()) p.delete(); ImageIO.write(bi, "jpg", new File(imagePath + File.separator + new_image_name)); Thus the image gets stored in the…
