2012-10-09 6 views
31

Sto utilizzando JPEGCAM per consentire agli utenti di scattare una foto del profilo con la loro webcam. Questo carica un file temporaneo come così:Rails come eliminare un file senza errori in caso di errore

def ajax_photo_upload  
    File.open(upload_path, 'w:ASCII-8BIT') do |f| 
    f.write request.raw_post 
    end 
    # @user.photo = File.open(upload_path) 
    @user.assign_attributes(
    :photo => File.open(upload_path), 
    :orig_filename => "#{current_user.full_name}.jpg" 
) 
    if @user.save 
    respond_to do |format| 
    ..... 
private 

    def upload_path # is used in upload and create 
    file_name = session[:session_id].to_s + '.jpg' 
    File.join(::Rails.root.to_s, 'public', 'temp', file_name) 
    end 

Qual è il modo migliore per andare su l'eliminazione di questo file temporaneo in modo sicuro? Grazie

risposta

19

Se sei sicuro di aver finito, perché non usare solo FileUtils.rm o FileUtils.rm_f?

FileUtils.rm_f(upload_path)

http://www.ruby-doc.org/stdlib-1.9.3/libdoc/fileutils/rdoc/FileUtils.html#method-c-rm_f

Si potrebbe anche ignorare questo in Rails, e hanno un cron che si sveglia ed elimina i file più vecchi di un giorno dalla directory temp che corrispondono a questi file temporanei. Questo ha il vantaggio di un margine di errore se un file non viene rielaborato - non lo si esegue immediatamente - e l'operazione sul file non viene eseguita sul ciclo richiesta/risposta per Rails, che risponderà quindi un po 'più velocemente.

72

Quando si sa che si è fatto con il file:

File.delete(path_to_file) if File.exist?(path_to_file) 

Un'altra cosa: fare in modo che hai sempre chiudere i file che avete aperto, un sistema operativo in grado di gestire solo un certo numero di file aperti/descrittori di file e ti possono incorrere in strani errori quando si passa quel limite ... Quindi, quando si desidera aprire i file in Ruby sempre utilizzare il modulo di blocco:

File.open(path) do |f| 
    # ... 
end 

e Ruby si chiuderà il file automaticamente tu. Se il modulo di blocco non è utilizzabile, è necessario chiudere i file da soli:

f = File.open(path) 
# ... 
f.close 

quindi assicuratevi di chiudere il file che si passa a @user.assign_attributes(...) ...

+0

attenti con condizioni di gara è multi threaded o multi app'ed ... – rogerdpack

Problemi correlati