Как я могу сделать так, чтобы carrierwave не сохраняла исходный файл после обработки версий?
Я использую CarrierWave для загрузки файлов в Rails 3.1 и ищу способ сэкономить место на сервере. Многие загружаемые фотографии имеют размер свыше 20 МБ, поэтому после обработки их размером до 1024 x 1024 я хотел бы удалить оригинал. Есть ли простой способ сделать это в классе загрузчика?
Спасибо, - Марк
5 ответов
Вы можете определить обратный вызов after_save в вашей модели и удалить фотографию.
Я не знаю вашу модель, но что-то вроде этого может сработать, если вы настроите ее:
class User << ActiveRecord::Base
after_create :convert_file
after_create :delete_original_file
def convert_file
# do the things you have to do
end
def delete_original_file
File.delete self.original_file_path if File.exists? self.original_file_path
end
end
Раньше у меня было две версии и понял, что мне не нужен оригинал
Так что вместо того, чтобы иметь
version :thumb do
process :resize_to_limit => [50, 50]
end
version :normal do
process :resize_to_limit => [300,300]
end
Я удалил: нормально и добавил это
process :resize_to_limit => [300, 300]
Теперь оригинал сохранен в нужном мне размере, и у меня нет третьего неиспользуемого изображения на сервере.
Каждый! Выбранное решение не работает для меня. Мое решение:
after :store, :remove_original_file
def remove_original_file(p)
if self.version_name.nil?
self.file.delete if self.file.exists?
end
end
class FileUploader < CarrierWave::Uploader::Base
after :store, :delete_original_file
def delete_original_file(new_file)
File.delete path if version_name.blank?
end
include CarrierWave::RMagick
storage :file
.
. # other configurations
end
Это немного взломать, но имеет преимущество в производительности
my_uploader.send :store_versions!, open(my_file)