2014-04-01 8 views
7

उत्पन्न करें मुझे अपनी फ़ाइलों के लिए अद्वितीय फ़ाइल नामों की आवश्यकता है।अद्वितीय फ़ाइल नाम

def filename 
    "#{SecureRandom.urlsafe_base64}.gif" 
end 

यह इस जैसे एक फ़ाइल सहेजता है:

ylGP48WxZXOY2OQ_x9dxAA.gif 

तथापि डेटाबेस में अपने संबंधित क्षेत्र इस तरह बचाया जा:

jED48PRNz0asZzwYQXzecw.gif 

मुझे लगता है कि क्या हो रहा है Carrierwave है file_name फ़ंक्शन को फ़ाइल लिखते समय और जब यह डेटाबेस में उदाहरण सहेजता है, जिसके परिणामस्वरूप urlsafe_base64 को दो बार बुलाया जाता है और दो अलग-अलग तार बनाते हैं । यह पूरी तरह से काम करता है जब मैंने एक परीक्षण के रूप में नाम हार्डकोड किया है।

तो यह कैसे रोक सकता है? मुझे पता है कि यह पूछना अपमानजनक है, लेकिन मैं कैरियरवेव डेटाबेस में वही यादृच्छिक रूप से जेनरेट किए गए फ़ाइल नाम का उपयोग कैसे कर सकता हूं और फ़ाइल लिखते समय? मुझे गंभीरता से लगता है कि इसे एक बग माना जाना चाहिए।

def filename 
    random_string 
    end 

    protected 

    def random_string 
    @string ||= "#{SecureRandom.urlsafe_base64}.gif" 
    end 

मैं मानता हूँ carrierwave एक एक बालक अधिक सहज ज्ञान युक्त हो सकता है:

+0

जब तुम सिर्फ एक अद्वितीय फ़ाइल नाम चाहते हैं, तुम क्यों 'अपने फ़ाइल नाम के रूप में YYYYMMddHHmmss.gif' विचार करने के लिए कोशिश मत करो ..? –

+0

निश्चित रूप से एक विकल्प। मेरी इच्छा है कि वाहकवेव लगातार मेरे पैर की उंगलियों पर कदम नहीं उठाएगा ... यह अच्छा है लेकिन यह इतना बेहतर हो सकता है। – user3067865

उत्तर

2

http://ruby-doc.org/stdlib-2.4.0/libdoc/tempfile/rdoc/Tempfile.html

tempfile

अस्थायी फ़ाइलों के प्रबंधन के लिए एक उपयोगिता वर्ग। जब आप टेम्पफ़ाइल ऑब्जेक्ट बनाते हैं, तो यह एक अद्वितीय फ़ाइल नाम के साथ एक अस्थायी फ़ाइल बनाएगा। एक tempfile वस्तुओं सिर्फ एक फ़ाइल वस्तु की तरह व्यवहार करता है, और आप उस पर सभी सामान्य फ़ाइल कार्रवाई कर सकते हैं: पढ़ने डेटा, डेटा लेखन अपनी अनुमतियाँ बदलें, आदि इसलिए हालांकि इस वर्ग नहीं स्पष्ट द्वारा समर्थित सभी उदाहरण तरीकों दस्तावेज़ करता है फ़ाइल, आप में तथ्य कर सकते हैं तथ्य किसी टेम्पलेट फ़ाइल पर किसी फ़ाइल इंस्टेंस विधि को कॉल करें।

require 'tempfile' 

file = Tempfile.new('foo') 
file.path  # => A unique filename in the OS's temp directory, 
       # e.g.: "/tmp/foo.24722.0" 
       # This filename contains 'foo' in its basename. 
file.write("hello world") 
file.rewind 
file.read  # => "hello world" 
file.close 
file.unlink # deletes the temp file 
संबंधित मुद्दे