2012-10-09 17 views
31

Estoy usando JPEGCAM para permitir a los usuarios tomar una foto de perfil con su cámara web. Esta carga un archivo temporal como tan:Rails cómo eliminar un archivo sin fallar en el error

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 

Cuál es la mejor manera de ir sobre la eliminación de este archivo temporal con seguridad? Gracias

Respuesta

19

Si está seguro de haber terminado con él, ¿por qué no simplemente usar 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

También puede ignorar esto en los carriles, y tienen un cron que se despierta y elimina los archivos de más de un día desde el directorio temporal que coincidan con estos archivos temporales. Eso tiene el beneficio de un margen de error si un archivo no se reprocesa - no lo registra inmediatamente - y la operación de archivo no se realiza en el ciclo de solicitud/respuesta para Rails, que luego responderá un poco más rápido.

72

Cuando se sabe que haya terminado con el archivo:

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

Otra cosa: asegúrese de que usted siempre cerca de los archivos que se han abierto, un sistema operativo sólo puede manejar un cierto número de archivos abiertos/descriptores de archivos y usted puede encontrarse con errores extraños cuando se pasa de ese límite ... Así que cuando se quiere abrir archivos en Ruby siempre usar la forma de bloque:

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

y Ruby se cerrará automáticamente el archivo de tú. Si la forma de bloque no se puede utilizar, hay que cerrar archivos en solitario:

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

así que asegúrese de cerrar el archivo que se pasa a @user.assign_attributes(...) ...

+0

cuidado con las condiciones de carrera es multihilo o multi aplicado ... – rogerdpack

Cuestiones relacionadas