2010-05-10 16 views
11

Tengo una aplicación sinatra simple que necesita para generar un archivo (a través de un proceso externo), enviar ese archivo al navegador y, finalmente, eliminar el archivo del sistema de archivos. Algo a lo largo de estas líneas:¿Cómo puedo eliminar un archivo en Sinatra después de haberlo enviado a través de send_file?

class MyApp < Sinatra::Base 
    get '/generate-file' do 

    # calls out to an external process, 
    # and returns the path to the generated file 
    file_path = generate_the_file() 

    # send the file to the browser 
    send_file(file_path) 

    # remove the generated file, so we don't 
    # completely fill up the filesystem. 
    File.delete(file_path) 

    # File.delete is never called. 

    end 
end 

Parece, sin embargo, que la llamada send_file completa la solicitud, y cualquier código después de que no recibe plazo.

¿Hay alguna forma de garantizar que el archivo generado se limpia después de que se haya enviado correctamente al navegador? ¿O tendré que recurrir a un trabajo cron que ejecute un script de limpieza en algún intervalo?

Respuesta

3

Lamentablemente, no hay devoluciones cuando usa send_file. solución común es usar las tareas cron para limpiar los archivos temporales

0

podría ser una solución para almacenar temporalmente el contenido del archivo en una variable, como:

contenidos = file.read

Después de esto, elimine el archivo:

File.delete (ruta_archivo)

Por último, devuelven el contenido:

contenidos

Esto tiene el mismo efecto que el send_file().

+0

¿No utilizaría esto más memoria? – James

+0

-1, ¿y si el archivo tiene 4GB de largo? – yeyo

+0

@Kira, ¿cómo enviar un archivo de 4GB a un navegador? Tal caso debería evitarse en el método 'generate_the_file()'. Mi sugerencia fue cambiar el orden de las acciones, de modo que el archivo generado se elimine antes de que el navegador reciba el archivo ... la pregunta original. –

Cuestiones relacionadas