2011-01-20 2 views
14

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

Заранее спасибо!

+3

Похоже, что они не имеют его (пока) Просто добавил пользовательский валидатор к моей модели, => https://gist.github.com/795665 – jpemberthy

+0

я работал с вышеуказанным раствором НЕМНОГО себя. просто имейте в виду, что это только подтвердит размер изображения после его хранения в кеше. с точки зрения проверки на стороне клиента, я все еще смотрю себя –

+0

Если вы хотите защитить свой сайт от загрузки смехотворно больших файлов, подтверждения CarrierWave не помогут, вместо этого выучите [как защищать сервер] (http://stackoverflow.com/questions/2200188/рельсы-файлы для загрузки-размерного ограничение). Валидации размера файла CarrierWave могут быть полезны, если вы хотите иметь разные ограничения по размеру для видео и изображений или вы хотите проверить минимальный размер файла. – skalee

ответ

20
+5

Это проверяет, загружен ли файл, что может быть проблемой для тех, кто использует Amazon S3. – lulalala

+0

Да, я ищу способ проверить, прежде чем файл будет загружен. – Raphael

+0

Если вам нужна проверка перед загрузкой, вы можете использовать gem. (Https://github.com/musaffa/file_validators). – Musaffa

-1

Here is the solution, что я придумал - хитрость заключается в том, что я не мог проверить размер файла непосредственно, как сделал бомбу Туман RubyGem, если файл не был были загружены. Я ожидаю, что там будет более чистый способ задать CarrierWave, если файл будет загружен.

5

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

-1
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 
4

С 1.0 версии CarrierWave имеет встроенные проверки размера файла.

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

gem 'carrierwave', '~> 1.0' 

метод Add 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 
Смежные вопросы