2013-10-24 4 views
0

Я следую за этим tutorial for file size validation with Carrierwave, и он работает по большей части.Удостоверение файла размера носителя CarrierWave хранит изображение в каталоге/tmp/при завершении проверки

В моей модели ...

validates :image, :file_size => { :maximum => 2.megabytes.to_i } 

Если я иду, чтобы загрузить изображение 5MB я получаю ошибку Изображение слишком большой (должен быть не более 2 МБ). Большой! Проблема заключается в том, что файл размером 5 МБ находится в /uploads/tmp/. Очевидно, что это может стать чрезвычайно ресурсоемким, и я не хочу, чтобы файл сохранялся, если он был слишком большим.

Любые идеи? Заранее спасибо.

EDIT

Я использую Heroku и думаю, что это могло бы иметь что-то делать с кэшированием и формы вновь появится. См. here. Думаю, другими словами, что я пытаюсь сделать, это отключить форму redisplays для изображения? Потому что изображение показывает (необработанное и полученное из каталога /uploads/tmp/). Хотя, если я перезагружаю страницу (не повторно заполняя форму), изображение исчезает из формы, но файл все еще остается в директории /tmp. Надеюсь, это имеет смысл.

ответ

1

Вы можете удалить файл по ошибке #remove!, если проверка не удалась.

# lib/file_size_validator.rb 
def validate_each(record, attribute, value) 
    ... 
    CHECKS.each do |key, validity_check| 
    ... 
    record.errors.add(attribute, MESSAGES[key], errors_options) 
    if options[:remove_if_invalid] 
     # Remove cached file 
     value.remove! 
    end 
    end 
end 

# in model source 
validates :image, :file_size => { :maximum => 2.megabytes.to_i, :remove_if_invalid => true } 

Если вам не нравится деструктивная операция во время проверки, вы можете установить флаг и удалить файл позже.

2

У меня была такая же проблема, и я применил решение, предлагаемое @labocho, но после этого перерисовка несущей волны больше не работает. Итак, я создал функцию в своем контроллере, чтобы проверить и удалить папку старого кэша изображений и использовать ее как функцию before_filter для обработки формы. Пока нет проблем. Мой код выглядит так:

class ImagesController < ApplicationController 
    before_action :remove_old_cache, only: [:create] 

    # Handle image creation 
    def create 
    ... 
    end 

    # Delete tmp image directory if validation fails (for carrier wave) 
    def remove_old_cache 
    image = params[:image] 
    if image[:image] && !image[:image_cache].empty? 
     cache_name = image[:image_cache] 
     # get the cache directory 
     cache_dir = cache_name.split('/')[0] 
     FileUtils.rm_rf(File.join("#{Rails.root}", "/public/uploads/tmp/", cache_dir)) 
    end 
    end 
    ... 
end 
+0

как бы эта работа при использовании nested_attributes, и было много изображений, так сказать, я имел это animal_images_attributes "=> {" 0 "=> {" image_cache "=>"», "image" => # , @ original_filename = "cat.jpg", @ content_type = "image/jpeg ", @ headers =" Content-Disposition: form-data; имя = \ "животное [animal_images_attributes] [0] [изображение] \"; filename = \ "cat.jpg \" \ r \ nContent-Type: image/jpeg \ r \ n ">, " _destroy "=>" false "}}}, " commit "=>" Создать рекламу "} – Richlewis

+0

с некоторыми настройками ive заставил его работать, собирается попробовать и итерации через массив хешей теперь – Richlewis

Смежные вопросы