Neu Versionen mit Carrierwave mit Rubin
Der website, die ich arbeite, ist zu gehen durch ein redesign und als solche unsere user-Bilder müssen neu dimensioniert werden. Die website ist derzeit mit carrierwave Juwel, um alle Bild-und Videobearbeitung, und jedes Bild hat eine original-Datei mit einem eindeutigen Dateinamen auf der Basis der folgenden:
def filename
if original_filename
if model && model.read_attribute(:user_image).present?
model.read_attribute(:user_image)
else
@name ||= "#{secure_token}.#{file.extension}" if original_filename.present?
end
end
end
und secure_token erzeugt werden,
def secure_token
var = :"@#{mounted_as}_secure_token"
model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid)
end
Den task, der erstellt wird, um dies zu tun ist:
##
# CarrierWave Amazon S3 File Reprocessor Rake Task
#
# Written (specifically) for:
# - CarrierWave
# - Ruby on Rails 3
# - Amazon S3
#
# Works with:
# - Any server of which you have write-permissions in the Rails.root/tmp directory
# - Works with Heroku
#
# Not tested with, but might work with:
# - Ruby on Rails 2
#
# Might work with, after a couple of tweaks:
# - File System Storage
# - Cloud Files Storage
# - GridFS
#
# Examples:
#
# Reprocess all versions of User#avatar
# rake carrierwave:reprocess class=User mounted_uploader=avatar
#
# Reprocess the versions: thumb, small, medium for User#avatar
# rake carrierwave:reprocess class=User mounted_uploader=avatar versions='thumb, small, medium'
#
# Reprocess for an underlying association, for things like Embedded MongoDB Documents
# which are models you cannot access directly, but rather through a regular Document
#
# Embeds One (picture) Association
# rake carrierwave:reprocess class=User association=picture mounted_uploader=image versions='thumb, small, medium'
#
# Embeds Many (pictures) Association
# rake carrierwave:reprocess class=User association=pictures mounted_uploader=image versions='thumb, small, medium'
#
# WARNING
# There is an issue with "Rake", that you cannot name your mounted_uploader "file".
# If you do this, then you will not be able to reprocess images through this rake task
# class User
# include Mongoid::Document
# mount_uploader :file, PictureUploader
# end
#
# This will NOT work with reprocessing through Rake because the mounted_uploader uses the "file" attribute.
namespace :carrierwave do
##
# Only tested with Amazon S3 Storage
# Needs some minor modifications if you want to use this for File System Store, Cloud Files and GridFS probably.
# This should work without Ruby on Rails as well, just set a different TMP_PATH.
desc "Reprocesses Carrier Wave file versions of a given model."
task :reprocess => :environment do
##
# Load in the OPEN URI library to be able
# to pull down and store the original file in a temp directory
require 'open-uri'
##
# Default constants
TMP_PATH = "#{Rails.root}/tmp/carrierwave"
##
# Set environment constants
CLASS = ENV['class'].capitalize
ASSOCIATION = ENV['association'] || nil
MOUNTED_UPLOADER = ENV['mounted_uploader'].to_sym
VERSIONS = ENV['versions'].nil? ? Array.new : ENV['versions'].split(',').map {|version| version.strip.to_sym}
##
# Find the Model
MODEL = Kernel.const_get(CLASS)
##
# Create the temp directory
%x(mkdir -p "#{TMP_PATH}")
##
# Find all records for the provided Model
records = MODEL.all
##
# Output to console
puts "\nCarrier Wave Version Reprocessing!"
puts "======================================="
puts "Model: #{CLASS}"
puts "Mounted Uploader: #{MOUNTED_UPLOADER}"
puts "Association: #{ASSOCIATION}" if ASSOCIATION
puts "Versions: #{VERSIONS.empty? ? "all" : VERSIONS.join(', ')}\n\n"
##
# Run through all records
records.each do |record|
##
# Set the mounted uploader object
# If it has a one-to-one association (singular) then that object
# will be returned and wrapped in an array so we can "iterate" through it below.
#
# If it has a one-to-many association then it will return the array of associated objects
#
# If no association is specified, it assumes the amounted uploader is attached to the specified CLASS
if ASSOCIATION
if ASSOCIATION.singular?
objects = [record.send(ASSOCIATION)]
else
objects = record.send(ASSOCIATION)
end
else
objects = [record]
end
##
# Iterates through the objects
objects.each do |object|
##
# Returns the mounted uploader object
mounted_object = object.send(MOUNTED_UPLOADER)
##
# Retrieve Filename
filename = mounted_object.path.split('/').last
##
# Output to console
puts "Reprocessing: #{filename}"
##
# Read out the original file from the remote location
# and write it out to the temp directory (TMP_PATH)
# This file will be used as the base file to reprocess
# the versions. Once all versions have been processed,
# this temp file will be directly removed.
open(mounted_object.url) do |original_object|
File.open(File.join(TMP_PATH, filename), 'w') do |temp_file|
temp_file.write(original_object.read)
end
end
##
# By default it will add all available versions to the versions variable
# which means that all available versions will be reprocessed.
# If the "versions" argument has been provided, then only the specified
# version(s) will be set to the versions variable, and thus, only these
# will be reprocessed.
versions = mounted_object.versions.map {|version| version[0]}
versions = VERSIONS unless VERSIONS.empty?
##
# Reprocesses the versions
versions.each do |version|
mounted_object.send(version).cache!(File.open(File.join(TMP_PATH, filename)))
mounted_object.send(version).store!
end
##
# Removes the temp file
%x(rm "#{TMP_PATH}/#{filename}")
end
end
end
end
Das problem ist, dass, während es erstellt den neuen Bildern, das speichern von Dateien unter einem neuen Dateinamen, anstatt die Benennung der Bestimmungen der Bild-uploader, so dass die website nicht finden können. Das folgende ist ein Beispiel, wie die Bilder gespeichert werden.
Wie es sein sollte:
Original-Datei:
fdk392ks93_39ei.png
thumbnail-version:
thumb_fdk392ks93_39ei.png
Wie es ist:
Original-Datei:
fdk392ks93_39ei.png
thumbnail-version:
thumb_fajeilkadifej_jakdjfi.png
Jede Hilfe wäre sehr geschätzt.
Weitere Infos:
Modell: Benutzer
Uploader: user_image (dies ist auch der name der Spalte, die speichert die Ordner - /Dateinamen)
- Bearbeitete Teile: so sollte es sein: Original-Datei: fdk392ks93_39ei.png-thumbnail-version: thumb_fdk392ks93_39ei.png, Wie es ist: Original-Datei: fdk392ks93_39ei.png-thumbnail-version: thumb_fajeilkadifej_jakdjfi.png
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach dem Aufruf
recreate_versions!
zu nennensave!
auf das Modell. Sie können sich diese Frage, wo jemand fragte, im Grunde die gleiche Sache.In der README klar, wie neu Carrierwave Versionen:
https://github.com/jnicklas/carrierwave/blob/master/README.md
"Kommt man vielleicht zu einer situation, wo Sie wollen, um nachträglich ändern, eine version oder eine neue hinzufügen. Sie können die recreate_versions! Methode, um erstellen Sie die Versionen aus, die base Datei. Dies wird ein naiver Ansatz der re-upload und Verarbeitung der angegebenen version oder alle Versionen, wenn none als argument übergeben.
Oder auf einem bereitgestellten uploader: