使用jax-rs发送临时文件

时间:2015-04-07 16:36:47

标签: java file rest jax-rs

我正在尝试使用jax-rs发送临时文件,并在下载完成后删除临时文件。为此,我将InputSream子类化,以便在流关闭后得到通知。这就是我到目前为止所做的:

@GET
@Path("download/{fileName}")
public Response downloadFile(@PathParam("fileName") String fileName) {
    InputStream inputStream = new InputStreamWithFileDeletion(new getFile(filename));

    Response.ResponseBuilder response = Response.ok((Object) file);
    response.header("Content-Disposition",
            "attachment; filename="+"fileName"+".xls");
    return response.build();
}

InputStreamWithFileDeletion:

public class InputStreamWithFileDeletion extends FileInputStream {
    File f;

    public InputStreamWithFileDeletion(File file) throws FileNotFoundException {
        super(file);
        f = file;
    }

    @Override
    public void close() throws IOException {
        super.close();
        f.delete();
    }
}

不幸的是,一旦下载完成,就不会调用close()。我错过了什么吗?

3 个答案:

答案 0 :(得分:2)

更改

Response.ResponseBuilder response = Response.ok((Object) file);

Response.ResponseBuilder response = Response.ok(inputStream);

答案 1 :(得分:1)

根据Sven Junga的回答,我提出了这个解决方案:

Path p = Paths.get(tempFile);
InputStream is = Files.newInputStream(p);
Files.delete(p);
return Response.ok(is).header("Content-Disposition", "attachment; filename=f.txt").build();

一旦输入流被消耗,文件将被删除。

答案 2 :(得分:0)

更改此行

InputStream inputStream = new InputSreamWithFileDelition(new getFile(filename));

InputSreamWithFileDelitioninputStream = new InputSreamWithFileDelition(new getFile(filename));

确保调用好close方法。

然后在AutoCloseAble类中实现InputStreamWithFileDelition,默认情况下会调用您的覆盖关闭方法。