Проверить размер загрузки с помощью Carrierwave

В нашем последнем приложении нам нужно обработать несколько загрузок, раньше я работал с paperclip, и все просто работает! но мы даем carrierwave попробовать, это выглядит многообещающим, но я не могу найти , как проверить размер вложения, похоже, что документация не содержит никакой информации об этом, мы должны добавить его вручную в модель с помощью специального валидатора?

Спасибо заранее!

Ответы

Ответ 2

Я сделал активную модель File Validators, которая проверяет тип содержимого и проверку размера файла для Carrierwave, PaperClip, Drangonfly, Refile (надеюсь он будет работать с другими решениями для загрузки). Он определяет тип содержимого на основе содержимого файла и имеет детектор ложных сообщений типа медиа. Он работает как до, так и после загрузки.

Ответ 3

Так как 1.0 версия CarrierWave имеет встроенную проверку размера файла.

Установите последний carrierwave драгоценный камень

gem 'carrierwave', '~> 1.0'

Добавьте метод size_range, чтобы обеспечить минимальный размер и максимальный размер

class ImageUploader < CarrierWave::Uploader::Base
  def size_range
    0..2.megabytes
  end

В модели добавьте validates_integrity_of, чтобы подтвердить размер файла (и тип содержимого) изображения.

class Image < ApplicationRecord
  mount_uploader :image, ImageUploader

  validates_integrity_of :image

Ответ 4

Вот решение, которое я придумал - трюк заключался в том, что я не мог напрямую проверить размер файла, так как это сделало Fog RubyGem бомбы, если файл не был загружен. Я ожидаю, что там будет более чистый способ задать CarrierWave, если файл будет загружен.

Ответ 5

taken from https://github.com/carrierwaveuploader/carrierwave/wiki/How-to%3A-Validate-attachment-file-size

You can use a Rails custom validator to verify your attachment meets specific file size requirements.

Grab a copy of the validator from https://gist.github.com/1009861 and save it to your lib/ folder as file_size_validator.rb. Add the error translations to config/locales/en.yml or wherever is appropriate for your setup. Then do this in your parent model:

# app/models/brand.rb 
require 'file_size_validator' 
class Brand < ActiveRecord::Base 
  mount_uploader :logo, BrandLogoUploader 
  validates :logo, 
    :presence => true, 
    :file_size => { 
      :maximum => 0.5.megabytes.to_i 
    } 
end 

Like validates_length_of, validates_file_size accepts :maximum, :minimum, :in [range], and :is options.

A custom validator could also be used like this.

# app/models/user.rb 
class User< ActiveRecord::Base 
  attr_accessible :product_upload_limit
  has_many :products
end

# app/models/brand.rb 
class Product < ActiveRecord::Base 
  mount_uploader :file, FileUploader
  belongs_to :user
  validate :file_size

  def file_size
    if file.file.size.to_f/(1000*1000) > user.product_upload_limit.to_f
      errors.add(:file, "You cannot upload a file greater than #{upload_limit.to_f}MB")
    end
  end
 end

Here, the upload limit varies from user to user & is saved in the user model.

other link :

http://stevenyue.com/2013/04/03/validate-attachment-file-size-and-type-in-rails/
https://richonrails.com/articles/getting-started-with-paperclip
https://gist.github.com/chrisbloom7/1009861