获取carrierwave上传的文件大小

时间:2013-12-18 14:52:16

标签: ruby-on-rails upload carrierwave

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

<%= upload.file.size %>

<%= upload.file_size %>

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

4 个答案:

答案 0 :(得分:11)

这是答案。 CarrierWave没有专门给你,所以你必须做一个很好的工作:

number_to_human_size(object.attachment.file.size)

答案 1 :(得分:3)

/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

答案 2 :(得分:0)

不幸的是,载波一旦存储就无法提供确定上传文件大小的方法(因为它不知道它,只有这样才能重新访问文件并检查文件的大小)。您可以在这里使用两种不同的方案:

  1. 创建一个帮助程序,它将从存储中检索文件并确定它的大小(这可能很棘手,我个人不会这样做。)

  2. 记录文件上传后的大小,并将其存储为模型的属性(有一个指南in Carrierwave wiki描述如何执行此操作。

答案 3 :(得分:0)

这是迟到的,但我想我会为未来的观众添加。

如果您想使用RMagick和MiniMagick

,请点击链接

&#34;如果您将尺寸指定给自定义处理器中的模型(已安装上传器),则会在上传时将其与图像路径一起保存。&#34; < / p>

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