2013-12-18 100 views
2

我正在尝试获取carrierwave上传的文件大小。我试图做的事情,如:获取carrierwave上传的文件大小

<%= upload.file.size %> 

<%= upload.file_size %> 

也不正常工作。我还运行了:上传的方法,但没有看到任何会导致我上传文件大小的内容。如何获取上传的文件大小?

回答

0

不幸的是,carrierwave没有提供确定上传文件大小的方法(因为它不知道它,只有这样才能重新访问文件并检查它的文件大小)。你可以在这里两种不同的情况去:

  1. 创建一个帮助其将检索存储的文件,并确定它的大小(这可能会非常棘手。我个人不会走那条路)。

  2. 记录文件的大小,一旦它被上传并存储为模型的属性(有一个引导in Carrierwave wiki描述如何做到这一点。

9

这里的答案。CarrierWave不具体地说,它给你,所以你必须做一个很好的解决办法:

number_to_human_size(object.attachment.file.size) 
2

/app/uploaders/attachment_file_uploader.rb

class AttachmentFileUploader < CarrierWave::Uploader::Base 
    include CarrierWave::MimeTypes 
    include ActionView::Helpers::NumberHelper 

    storage :file 

    process :set_content_type 
    process :store_file_attributes 

    .... 

    private 

    def store_file_attributes 
    if file && model 
     model.file_name = File.basename(file.file) 
     model.file_size = File.size(file.file) 
     model.human_size = number_to_human_size(model.file_size) 
    end 
    end 

end 

迁移:

class CreateAttachments < ActiveRecord::Migration 

    def change 
    create_table :attachments do |t| 
     t.references :attachable, polymorphic: true 
     t.string  :file 
     t.string  :file_name 
     t.integer :file_size 
     t.string  :human_size 
     t.string  :description 

     t.timestamps null: false 
    end 
    end 

end 
0

这是这样晚了,但我想我会增加对未来的观众。

按照链接,如果你想用RMagick和MiniMagick

使用

“如果你指定尺寸模型(你已经安装上传者)在一个自定义的处理器,将与一起保存上传时的图像路径。“

https://github.com/carrierwaveuploader/carrierwave/wiki/How-to%3A-Get-image-dimensions

class ImageUploader < CarrierWave::Uploader::Base 
    process :store_dimensions 

    # If you like, you can call this inside a version like this 
    # instead of at the top level. 
    # That will store the dimensions for this version. 
    version :show do 
    process :resize_to_limit => [500, 500] 
    process :store_dimensions 
    end 

    private 

    def store_dimensions 
    if file && model 
     model.width, model.height = `identify -format "%wx%h" #{file.path}`.split(/x/) 
    end 
    end 
end