2010-05-10 10 views
11

Mam prostą aplikację sinatra, która musi wygenerować plik (przez zewnętrzny proces), wysłać ten plik do przeglądarki, a na koniec usunąć plik z systemu plików. Coś wzdłuż tych linii:Jak mogę usunąć plik w Sinatrze po wysłaniu przez 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 

Wydaje się jednak, że połączenie send_file uzupełnia wniosek, a każdy kod po niej nie dostaje bieg.

Czy istnieje sposób, aby upewnić się, że wygenerowany plik jest czyszczony po jego pomyślnym wysłaniu do przeglądarki? Czy będę musiał odwołać się do zadania cron uruchamiającego skrypt czyszczenia w pewnym przedziale?

Odpowiedz

3

Niestety nie ma żadnych wywołań zwrotnych podczas korzystania z send_file. Wspólne rozwiązanie tutaj jest użycie zadania crona wyczyścić pliki tymczasowe

0

może to być rozwiązanie tymczasowe przechowywanie zawartości pliku w zmiennej, takie jak:

treści = file.read

Po tym, usunąć plik:

File.delete (ścieżka_do_pliku)

Wreszcie zwrócić zawartość:

zawartość

ten ma takie samo działanie jak twój send_file().

+0

Czy nie użyłoby to więcej pamięci? – James

+0

-1, co, jeśli plik ma 4 GB długości? – yeyo

+0

@Kira, wysyłając plik 4GB do przeglądarki? Taki przypadek powinien zostać uniemożliwiony w metodzie 'generate_the_file()'. Moja sugestia dotyczyła zmiany kolejności działań, tak aby wygenerowany plik został usunięty, zanim przeglądarka otrzyma plik ... oryginalne pytanie. –

Powiązane problemy