2014-04-01 67 views
7

我需要我的文件的唯一文件名。生成唯一的文件名

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

这样就节省了文件像这样:

ylGP48WxZXOY2OQ_x9dxAA.gif 

但在数据库中其各自的领域要保存这样的:

jED48PRNz0asZzwYQXzecw.gif 

我觉得发生了什么事是Carrierwave是在写入文件时以及在数据库中保存实例时调用file_name函数,导致urlsafe_base64被调用两次并创建两个不同的字符串。当我将一个名称硬编码为测试时,它完美地工作。

那怎么能阻止呢?我知道这是无礼的要求,但我怎么能让Carrierwave在数据库中使用相同的随机生成的文件名,以及在编写文件时?我认真地认为这应该被认为是一个错误。

+0

当你只是想唯一的文件名,你为什么不尽量考虑'YYYYMMddHHmmss.gif'为您的文件名..? –

+0

绝对是一个选项。我只是希望载波不会一直踩在我的脚趾上......这很好,但它可能会好得多。 – user3067865

回答

7

这是一个选项:

def filename 
    random_string 
    end 

    protected 

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

我同意carrierwave可能一个是一点点更直观。

2

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

将它视为

管理临时文件的实用程序类。当您创建一个 Tempfile对象时,它将创建一个具有唯一 文件名的临时文件。 Tempfile对象的行为就像一个File对象,并且您可以对其执行所有常见的文件操作:读取数据,编写 数据,更改其权限等。因此,尽管此类不显式记录所有支持的实例方法文件,你可以在 这个事实上调用Tempfile对象的任何File实例方法。

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