2012-10-09 11 views
31

पर असफल किए बिना फ़ाइल को कैसे हटाएं रेलवे मैं जेपीईजीकैम का उपयोग कर रहा हूं ताकि उपयोगकर्ता अपने वेब कैम के साथ प्रोफ़ाइल तस्वीर ले सकें।त्रुटि

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

तुम भी रेल में इस पर ध्यान न दें सकता है, और एक क्रॉन कि उठता है और अस्थायी निर्देशिका है कि इन अस्थायी फ़ाइलों से मेल खाते हुए एक दिन से अधिक पुराना फ़ाइलों को हटा देता है। अगर फ़ाइल को पुन: संसाधित करने में विफल रहता है तो त्रुटि के लिए कुछ मार्जिन का लाभ होता है - आप इसे तुरंत आरएम नहीं करते हैं - और फाइल ऑपरेशन रेल के लिए अनुरोध/प्रतिक्रिया पाश पर नहीं किया जाता है, जो तब थोड़ा तेज प्रतिक्रिया देगा।

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