Alex Reds
Alex Reds

Reputation: 307

Spring MVC Resources not refreshing

I'm working on an image manager system for my Spring MVC project, with the basic functions of displaying the gallery of all images stored in the local image folder, deleting images and uploading new images.

I would like that, once a new image is uploaded, the page reloads the images gallery, including the image just added. What it happens in fact is that the new image is correctly saved on the HD, but it doesn't automatically show up in the resources/img folder in the Java project; therefore, once the page is reloaded, the new image is not there. Only when I manually refresh the project, the new image appears in the resources/img folder.

The odd thing is, I don't have the same problem with the delete method: once an image is deleted, it disappears from the HD AND the resources/img folder, and the page reloads the gallery without showing the image just deleted.

Any idea where the problem could be?

Here is my controller

@Controller
public class imagesManagerController {

// READ ALL FILES FROM IMG FOLDER
@RequestMapping(value = "/imagesManager",  method = RequestMethod.GET)
public ModelAndView readImages
(@RequestParam(value = "error", required = false) String error) {

    // create model and link it to jsp imagesManager
    ModelAndView model = new ModelAndView("imagesManager");

    // return content from images folder and add it to model
    File imgsPath = new File("C:/Users/Alessandro/workspace/SpringMVCBlog/WebContent/resources/img");
    String[] imgsNames = imgsPath.list();
    model.addObject("imgsNames", imgsNames);

    //if upload fails, display error message
    if (error != null) {
        model.addObject("error",
                "Please select a file to upload");
    }

    return model;
}




//UPLOAD FILE TO HD
@RequestMapping(value = "/imagesManager/upload", method = RequestMethod.POST)
public String handleFileUpload (@RequestParam("file") MultipartFile file) {

    //get img name
    String imgName = file.getOriginalFilename();
    System.out.println(imgName);

    //create file path
    String folder = "C:/Users/Alessandro/workspace/SpringMVCBlog/WebContent/resources/img/";
    File path = new File (folder+imgName);
    System.out.println(path);

    if (!file.isEmpty()) {

        try {
            //get bytes array from file
            byte[] bytes = file.getBytes();

            //create output stream
            BufferedOutputStream stream = new BufferedOutputStream(
                    new FileOutputStream(path));

            //write img content on path
            stream.write(bytes);

            //close stream
            stream.close();

            //if upload is successful, reload page
            return "redirect:/imagesManager";

        } catch (Exception e) {
            return "You failed to upload " + imgName + " => " + e.getMessage();
        }

    } else {
        return "redirect:/imagesManager?error";
    }
}


// DELETE FILE FROM HD
@RequestMapping(value = "/imagesManager/delete", method = RequestMethod.POST)
public String deleteFile(@RequestParam (value="imgName") String imgName) {

    //create file path to be deleted
    String folder = "C:/Users/Alessandro/workspace/SpringMVCBlog/WebContent/resources/img/";
    File path = new File (folder+imgName);

    // delete file
    if (path.delete()) {
        //if delete is successful, reload page
        return "redirect:/imagesManager";

    } else {
        return "Delete operation failed";
    }
}

}

Upvotes: 0

Views: 1515

Answers (1)

Sully
Sully

Reputation: 14943

The problem is in the path:

WebContent/resources/img

It is refreshing probably due to IDE server auto-deployment. Test with %TEMP% path and check.

1) You should not save uploaded files to the application server file system.

2) You should not save uploaded files to the application folder as it is part of the deployment. It will only be deployed once and that folder is only for the application files.

Instead, use the cloud or a dedicated file system.

Upvotes: 1

Related Questions