2014-04-01 17 views
7

Tôi cần tên tệp duy nhất cho tệp của mình.Tạo tên tệp duy nhất

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

Điều này tiết kiệm một tập tin như thế này:

ylGP48WxZXOY2OQ_x9dxAA.gif 

tuy nhiên lĩnh vực tương ứng của nó trong cơ sở dữ liệu được lưu như thế này:

jED48PRNz0asZzwYQXzecw.gif 

Tôi nghĩ rằng những gì xảy ra là Carrierwave là gọi hàm file_name khi nó đang ghi tệp và khi lưu tệp trong cơ sở dữ liệu, kết quả là url urlsafe_base64 được gọi hai lần và tạo hai chuỗi khác nhau . Nó hoạt động hoàn hảo khi tôi đã hardcoded một tên như là một thử nghiệm.

Vậy làm cách nào để ngăn điều này? Tôi biết nó rất khó để hỏi, nhưng làm thế nào tôi có thể làm cho Carrierwave sử dụng cùng một tên tập tin được tạo ngẫu nhiên trong cơ sở dữ liệu và khi viết tệp? Tôi nghiêm túc nghĩ rằng điều này nên được coi là một lỗi.

+0

khi bạn chỉ muốn một tên tập tin độc đáo, tại sao bạn không thử để xem xét 'YYYYMMddHHmmss.gif' như tên tập tin của bạn ..? –

+0

Chắc chắn là một tùy chọn. Tôi chỉ muốn carrierwave sẽ không liên tục bước trên ngón chân của tôi ... nó tốt nhưng nó có thể tốt hơn rất nhiều. – user3067865

Trả lời

7

Đây là một lựa chọn:

def filename 
    random_string 
    end 

    protected 

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

Tôi đồng ý carrierwave thể một là một tad trực quan hơn.

2

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

Tempfile

Một lớp tiện ích để quản lý tập tin tạm thời. Khi bạn tạo đối tượng Tempfile , nó sẽ tạo tệp tạm thời với tên tệp độc đáo. Một đối tượng Tempfile hoạt động giống như đối tượng File, và bạn có thể thực hiện tất cả các thao tác tệp thông thường trên đó: đọc dữ liệu, ghi dữ liệu , thay đổi quyền của nó, v.v. Vì vậy, mặc dù lớp này không Tập tin, bạn có thể trong thực tế gọi bất kỳ phương pháp thể hiện tệp trên đối tượng 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 
Các vấn đề liên quan