verbos tutorial principios metodos example estandares java rest resteasy

java - tutorial - Cómo eliminar el archivo después de la respuesta REST



principios rest (6)

Sin conocer el contexto de su aplicación, puede eliminar el archivo cuando la VM salga:

file.deleteOnExit();

Ver: https://docs.oracle.com/javase/7/docs/api/java/io/File.html#deleteOnExit%28%29

¿Cuál es la mejor manera de gestionar la eliminación de un archivo después de que se haya devuelto como respuesta a una solicitud REST?

Tengo un punto final que crea un archivo a petición y lo devuelve en la respuesta. Una vez que se envió la respuesta, el archivo ya no es necesario y puede / debe eliminarse.

@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! }

Creo que podría crear un archivo tmp, pero habría pensado que había un mecanismo más elegante para lograrlo. El archivo puede ser bastante grande, así que no puedo cargarlo en la memoria.


guarde la respuesta en una variable tmp reemplazando su declaración de retorno así:

Response res = response.build(); //DELETE your files here. //maybe this is not the best way, at least it is a way. return res;


enviar el nombre del archivo en la respuesta:

return response.header("filetodelete", FILE_OUT_PUT).build();

después de eso puedes enviar eliminar el método de descanso

@POST @Path("delete/{file}") @Produces(MediaType.TEXT_PLAIN) public void delete(@PathParam("file") String file) { File delete = new File(file); delete.delete(); }


Hice algo como esto recientemente en el desarrollo del servicio de descanso usando jersey

@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(); }


Hay una solución más elegante , no escriba un archivo, solo escriba directamente en la secuencia de salida contenida en la instancia de Response .


Use un StreamingOutput como entidad:

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