当前位置: 首页 > 知识库问答 >
问题:

如何在REST响应[重复]后删除文件

祝昊东
2023-03-14

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

我有一个endpoint,可以根据请求创建一个文件,并在响应中返回它。一旦发送了响应,该文件就不再需要,可以/应该删除。

@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文件,但我认为有一个更优雅的机制来实现这一点。该文件可能相当大,因此我无法将其加载到内存中。

共有3个答案

韩飞翮
2023-03-14

我最近用泽西做了类似的事

@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();
    }
缪朝
2023-03-14

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

方昊英
2023-03-14

将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);
        }
    }
}
 类似资料:
  • 问题内容: 在将文件作为对REST请求的响应返回后,处理删除文件的最佳方法是什么? 我有一个端点,可根据请求创建文件并在响应中返回它。发送响应后,就不再需要该文件,可以/应该将其删除。 我想我可以创建一个tmp文件,但是我本来以为有一种更优雅的机制可以实现这一目标。该文件可能很大,因此我无法将其加载到内存中。 问题答案: 有一个 更优雅的解决方案 ,不写文件,只需直接写入实例中包含的输出流即可。

  • 我构建了一个使用BingAPI下载数据集的代码。当我在终端上运行它时,它返回以下错误: 所以我升级了Numpy,但没有用 那么我该怎么做呢?

  • 问题内容: 通过阅读这些和其他资料,我发现实现我想要的最干净的方法是使用Spring 3.1和可以在mvc-annotation中配置的消息转换器。我更新的spring配置文件是: 服务类与mkyong.com网站上提供的服务类相同,只不过我注释掉了商店名称变量的设置,因此它为null,即 我正在使用的Jacksonjar是jackson-mapper-asl 1.9.0和jackson-core

  • 问题内容: 这个问题已经在这里有了答案 : 如何从异步调用返回响应? (39个答案) 6年前关闭。 我使用原型进行AJAX开发,并使用如下代码: 而且我发现“结果”是一个空字符串。所以,我尝试了这个: 但这也没有用。如何获取responseText供其他方法使用? 问题答案: 请记住,在someFunction完成工作后很久才调用onComplete。您需要做的是将回调函数作为参数传递给somef

  • 问题内容: 我必须向现有表添加唯一约束。很好,除了表已经有数百万行,而且许多行违反了我需要添加的唯一约束。 删除有问题的行的最快方法是什么?我有一条SQL语句,该语句查找重复项并将其删除,但要花很长时间才能运行。有没有其他方法可以解决此问题?也许备份表,然后在添加约束后还原表? 问题答案: 其中一些方法似乎有些复杂,我通常这样做是: 给定table table,要在()上对其进行唯一化,使行保持为

  • 我有一个带有重复ID的熊猫数据框。下面是我的数据框 如何仅删除类型为