While developing an application with Sebastián that allow users to upload videos with some file name restrictions, meaning that it must contain only A-Z and 0-9 digits, underscores (_) as a valid component as well, and also the name must be preceded by it’s own #id, we came up with the need of applying this custom filter to each uploaded video. After doing some research on paperclip source code and internet tutorials, we suggest the following solution:
class Video < ActiveRecord::Base
has_attached_file :video,
:path => ":rails_root/public/system/:attachment/:id/:style/:normalized_video_file_name",
:url => "/system/:attachment/:id/:style/:normalized_video_file_name"
Paperclip.interpolates :normalized_video_file_name do |attachment, style|
attachment.instance.normalized_video_file_name
end
def normalized_video_file_name
"#{self.id}-#{self.video_file_name.gsub( /[^a-zA-Z0-9_\.]/, '_')}"
end
end
What are we doing here? Easy, in has_attached_file we edit the way paperclip returns the path and url by default, the most relevant components when saving and loading the file in order to display it.
Paperclip default values are:
path default => ":rails_root/public/system/:attachment/:id/:style/:filename"
url default => "/system/:attachment/:id/:style/:filename"
Values preceded by ’:’ are the standard interpolations paperclip has. For further information on this visit http://wiki.github.com/thoughtbot/paperclip/interpolations.
What we did was change * with *:normalized_video_file_name in both path and url, being the second a custom interpolation and then added the ‘normalized_video_file_name’ method to video.rb.
By doing this we not only achieve a way for paperclip to handle the file by this normalized way, but also have a method to access the normalized file name, plus being able to access the original file name through paperclip video_file_name method.
So remember on video_file_name you have the uploaded filename and on normalized_video_file_name you have the server filename.



Brilliant! Exactly the solution I was looking for :-D
Perfect!
Justo lo que buscaba. Excelente aporte.
Thank you sir! Saved me a bunch of time trying to figure this problem out.
Excellent work. It was exactly what i am looking at.
Thanks a lot.
Thanks a lot! Excellent Work!
This is great thanks, for the explanation.
How would you permanently change the video_file_name value to the new normalized_video_file_name?
Excellent Tutorial…. Thanx for sharing this….
Thank you! I’ve been trying to solve this problem all day.
Just be sure you don’t get crazy and use dynamic fields in your normalize method. Then when the record changes Paperclip won’t be able to find your file.
Thanks so much for this solution i have been up all night trying to solve this
Thank you, a life saver.