2010-11-29 13 views
14

en utilisant des rails avec Paperclip, je peux utiliser ce qui suit pour obtenir le nom de fichier lors d'une before_create:rails - nom de fichier Paperclip

extension = File.extname (photo_file_name) .downcase

Comment puis-je Parvenez nom du fichier .. En ce moment je photo_file_name qui fournit le fichier entier, titlename.pdf

i juste besoin titlename sans .pdf

Merci

Mise à jour

avec le code:

photo.rb:

before_create :obfuscate_file_name 

    #Paperclip for photo 
    has_attached_file :photo, 
...... 


private 

    def obfuscate_file_name 
    extension = File.extname(photo_file_name).downcase 
    fileNameOnly = File.basename(photo_file_name).downcase 
    self.photo.instance_write(:file_name, "#{fileNameOnly}_#{ActiveSupport::SecureRandom.hex(32)}#{extension}") 
    end 

Répondre

22

Utilisez File.basename avec l'argument suffix en option comme ceci:

file_name = File.basename(photo_file_name, File.extname(photo_file_name)); 

Travaux sur ma machine:

alt text

+0

Essayé, cela ne fonctionne pas .. Je vais mettre à jour avec le code ci-dessus. – AnApprentice

+0

C'est ce qu'il a fait. Merci Jacob. – AnApprentice

+1

@AnApprentice Vous êtes les bienvenus! :) –

18

La pièce jointe trombone a la méthode 'original_filename' pour cela.

+1

Je ne suis pas sûr que cela donnera ce que l'OP veut. Ils veulent 'a_file', pas' a_file.pdf'? – matsjoyce

+1

On dirait que le titre de cette question n'est peut-être pas assez précis. Les gens viennent probablement ici à la recherche de "paperclip filename", et trouvent cette réponse qui est la bonne réponse à cette question, donc ils la remettent en question même si ce n'est pas ce que le PO de cette question a demandé. –

0

Une autre option est définie par défaut, fonctionne pour tous les téléchargements.

Cet exemple fichier modifier le nom de 'nom par défaut' pour le Web, par exemple: test áé.jpg à test_ae_www.foo.com.jpg

aide/application_helper.rb

def sanitize_filename(filename) 
    fn = filename.split /(?<=.)\.(?=[^.])(?!.*\.[^.])/m 
    fn[0] = fn[0].parameterize 
    return fn.join '.' 
end 

Créer config/initializers/paperclip_defaults.rb

include ApplicationHelper 

Paperclip::Attachment.default_options.update({ 
    :path => ":rails_root/public/system/:class/:attachment/:id/:style/:parameterize_file_name", 
    :url => "/system/:class/:attachment/:id/:style/:parameterize_file_name", 
}) 

Paperclip.interpolates :parameterize_file_name do |attachment, style| 
    "#{sanitize_filename(attachment.original_filename)}_www.foo.com" 
end 

Besoin d'un estart, après avoir mis ce code

J'espère que ça aide! ;)