How to delete a file after sending it in a web app?

file, file-upload, java, spring, web-applications

Solution

Don't use `@ResponseBody`. Have Spring inject the `HttpServletResponse` and write directly to its `OutputStream`.

@RequestMapping("/getFile")
public void getFile(HttpServletResponse response) {
    String address = Services.createFile();
    File file = new File(address);
    response.setContentType("application/vnd.ms-excel");
    response.setHeader("Content-disposition", "attachment; filename=" + file.getName());

    OutputStream out = response.getOutputStream();
    FileInputStream in = new FileInputStream(file);

    // copy from in to out
    IOUtils.copy(in,out);

    out.close();
    in.close();
    file.delete();
}

I haven't added any exception handling. I leave that to you.

`FileSystemResource` is really just is a wrapper for `FileInputStream` that's used by Spring.

Or, if you want to be hardcore, you could make your own `FileSystemResource` implementation with its own `getOutputStream()` method that returns your own implementation of `FileOutputStream` that deletes the underlying file when you call `close()` on it.

Problem

I have a web application. I am using java and spring. The application can create a file and send it to the browser, this is working fine. The way I do it is: I create the file in a Services class, and the method returns the address to the controller. The controller then sends the file, and it is downloaded correctly. The code for the controller method is this. ``` @RequestMapping("/getFile") public @ResponseBody FileSystemResource getFile() { String address = Services.createFile(); response.setContentType("application/vnd.ms-excel"); return new FileSystemResource(new File (address)); } ``` The problem is that the file is saved in the server, and after many requests it will have a lot of files. I have to delete them manually. The question is: How can I delete this file after sending it? or Is there a way to send the file without saving it in the server?

Original source