如何在 REST 响应后删除文件

2022-09-01 23:24:14

在将文件作为对 REST 请求的响应返回后,处理删除文件的最佳方法是什么?

我有一个终结点,它根据请求创建一个文件并在响应中返回该文件。一旦调度了响应,该文件就不再需要,可以/应该被删除。

@Path("file")
@GET
@Produces({MediaType.APPLICATION_OCTET_STREAM})
@Override
public Response getFile() {

        // Create the file
        ...

        // Get the file as a steam for the entity
        File file = new File("the_new_file");

        ResponseBuilder response = Response.ok((Object) file);
        response.header("Content-Disposition", "attachment; filename=\"the_new_file\"");
        return response.build();

        // Obviously I can't do this but at this point I need to delete the file!

}

我想我可以创建一个tmp文件,但我本来以为有一个更优雅的机制来实现这一点。文件可能很大,所以我无法将其加载到内存中。


答案 1

将流输出用作实体:

final Path path;
...
return Response.ok().entity(new StreamingOutput() {
    @Override
    public void write(final OutputStream output) throws IOException, WebApplicationException {
        try {
            Files.copy(path, output);
        } finally {
            Files.delete(path);
        }
    }
}

答案 2

还有一个更优雅的解决方案,不要写文件,只需直接写入实例中包含的输出流。Response