【问题标题】:Getting file size of carrierwave upload获取载波上传的文件大小
【发布时间】:2014-01-06 19:38:14
【问题描述】:

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

<%= upload.file.size %>

<%= upload.file_size %>

两者都不起作用。我还在上传时运行了 :methods 并且没有看到任何会导致我上传文件大小的内容。如何获取上传的文件大小?

【问题讨论】:

    标签: ruby-on-rails upload carrierwave


    【解决方案1】:

    这就是答案。 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
      

      【讨论】:

        【解决方案3】:

        不幸的是,carrierwave 不提供确定上传文件大小的方法(因为它不知道,唯一的方法是重新访问文件并检查文件大小)。您可以在这里使用两种不同的场景:

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

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

        【讨论】:

          【解决方案4】:

          这已经很晚了,但我想我会为未来的观众添加。

          如果您想使用 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
          

          【讨论】:

            猜你喜欢
            • 2011-05-10
            • 2011-11-21
            • 1970-01-01
            • 2019-11-04
            • 2017-04-21
            • 1970-01-01
            相关资源
            最近更新 更多