How to update / rename a downloaded carrier-supported file?

I cannot figure out how to update / rename a file loaded / managed with Carrierwave-mongoid in rails. 3.2.6. I want to rename the file in db, as well as the file system.

Something like this, maybe ...

def rename( id , new_name ) f = UploadedFile.find(id) if f.update_attributes({ f.file.original_filename: new_name }) # this is WRONG, what is right??? new_path = File.join( File.dirname( f.file.current_path ) , new_name )) FileUtils.mv( f.file.current_path , new_path ) end return f end 

Let me add this after it has already been downloaded.

+4
source share
6 answers

I managed to get the following works, although I'm sure there is a more elegant way. I would appreciate any comments on the following

* add this to app / uploaders / file_uploader.rb

 def rename(new_name) sf = model.file.file new_path = File.join( File.dirname( sf.file ) , "#{new_name}#{File.extname( sf.file )}") new_sf = CarrierWave::SanitizedFile.new sf.move_to(new_path) model.file.cache!(new_sf) model.save! return model end 

Thanks!

+4
source

I used this rake task to reprocess the downloaded images after changing the version parameters (file name and image size) in the uploader file:

 # Usage: rake carrierwave:reprocess class=Model namespace :carrierwave do task :reprocess => :environment do CLASS = ENV['class'].capitalize MODEL = Kernel.const_get(CLASS) records = MODEL.all records.each do |record| record.photo.recreate_versions! if record.photo? end end end 

Notes:

  • Replace the "photo" with what you called your bootloader.
  • Rake tasks are in the lib / tasks folder.
  • This is using Active Record, not sure if Mongoid requires something different.
0
source

Based on @ user892583, I worked on it and came up with a simpler solution:

 def rename!(new_name) new_path = File.join(File.dirname(file.file), new_name) file.move_to(new_path) end 
0
source

I did it as follows:

  def filename if !cached? && file.present? new_filename = 'foobar' new_path = File.join(File.dirname(file.path), new_filename) file.move_to(new_path) recreate_versions! new_filename else super end end 

I think this is just the right way to rename a file.

0
source

The most efficient way to do this is to simply move the existing S3 object (assuming your storage level is S3):

 def rename(new_name) bucket_name = "yourapp-#{Rails.env}" resource = Aws::S3::Resource.new bucket = resource.bucket(bucket_name) object = bucket.object(path) new_filename = "#{new_name}#{File.extname(path)}" new_path = File.join(File.dirname(path), new_filename) object.move_to(bucket: bucket_name, key: new_path) model.update_column(mounted_as, new_filename) model.reload # Now call 'recreate_versions!(*versions.keys)' # if you want versions updated. Explicitly passing # versions will prevent the base version getting # reuploaded. model end 

It uses the aws-sdk-s3 gem.

0
source

I store image files - and derivative versions - in an S3-compatible solution. I am using Carrierwave (1.2.2) with the "fog-aws" gem (3.0.0) on Rails 5.1. The following public method works for me when adding "Uploader" to the file (for example, app/uploaders/example_uploader.rb ):

 class ExampleUploader < CarrierWave::Uploader::Base <snip> # Renames original file and versions to match given filename # # Options: # * +:keep_original+ - Do not remove original file and versions (ie, copy only) def rename(new_filename, options = {}) return if !file || new_filename == file.filename target = File.join(store_path, new_filename) file.copy_to(target) versions.keys.each do |k| target = File.join(store_path, "#{k}_#{new_filename}") version = send(k).file version.copy_to(target) end remove! unless options[:keep_original] model.update_column(mounted_as, new_filename) && model.reload end <snip> end 
0
source

Source: https://habr.com/ru/post/1440660/


All Articles