2012-10-09 2 views
31

나는 사용자가 웹캠으로 프로필 사진을 찍을 수 있도록 JPEGCAM을 사용하고 있습니다. 임시 파일을 다음과 같이 업로드합니다 :오류없이 오류없이 파일을 삭제하는 방법을 레일

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 

임시 파일을 안전하게 삭제하는 가장 좋은 방법은 무엇입니까? 감사합니다

답변

19

당신이 그것을 완료 확실하다면, 그냥 FileUtils.rm 또는 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

또한 레일이를 무시하고 깨어 나면 이러한 임시 파일과 일치하는 임시 디렉토리에서 하루보다 오래된 파일을 삭제 크론을 가질 수

. 파일을 다시 처리하지 못할 때 (즉, 즉시 rm하지 않음) 파일 조작이 Rails의 요청/응답 루프에서 수행되지 않으면 약간 더 빨리 응답합니다.

72

당신이 파일을 수행하는 것을 알 때 : 다른 것은

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

: 당신이 열려있는 당신을 항상 가까이 파일, 운영 체제는 열려있는 파일의 특정 수를 처리 할 수 ​​있는지 확인해야/파일 설명하고거야 당신은 항상 하나의 블록 형태로 사용 루비에서 파일을 열고 자 그럼 언제 ... 그 한계를 통과 할 때 이상한 버그로 실행할 수 있습니다 : 루비가 파일을 자동으로 종료됩니다

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

과 당신. 블록 양식을 사용할 수없는 경우, 사용자가 직접 파일을 닫아야 :

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

그래서 당신이 @user.assign_attributes(...)에 전달 파일을 닫해야합니다 ... 경쟁 조건

주의
+0

멀티 스레드 또는 멀티입니다 app'ed ... – rogerdpack

관련 문제