web-dev-qa-db-ja.com

REST responseの後にファイルを削除する方法

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ファイルを作成できると思いますが、これを実現するためのより洗練されたメカニズムがあると思いました。ファイルが非常に大きい可能性があるため、メモリにロードできません。

19
tarka

より洗練された解決策があります。ファイルを書き込まず、Responseのインスタンスに含まれる出力ストリームに直接書き込むだけです。

9
user177800

StreamingOutputをエンティティとして使用します。

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);
        }
    }
}
12
cmaulini

アプリケーションのコンテキストを知らなくても、VM終了時にファイルを削除できます:

file.deleteOnExit();    

参照: https://docs.Oracle.com/javase/7/docs/api/Java/io/File.html#deleteOnExit%28%29

1
sinclair

最近、ジャージを使用したRESTサービス開発でこのようなことをしました

@GET
@Produces("application/Zip")
@Path("/export")
public Response exportRuleSet(@QueryParam("ids") final List<String> ids) {

    try {
        final File exportFile = serviceClass.method(ruleSetIds);

        final InputStream responseStream = new FileInputStream(exportFile);


        StreamingOutput output = new StreamingOutput() {
            @Override
            public void write(OutputStream out) throws IOException, WebApplicationException {  
                int length;
                byte[] buffer = new byte[1024];
                while((length = responseStream.read(buffer)) != -1) {
                    out.write(buffer, 0, length);
                }
                out.flush();
                responseStream.close();
               boolean isDeleted = exportFile.delete();
                log.info(exportFile.getCanonicalPath()+":File is deleted:"+ isDeleted);                 
            }   
        };
        return Response.ok(output).header("Content-Disposition", "attachment; filename=rulset-" + exportFile.getName()).build();
    }
1
Praneeth