Как я могу указать имя файла для моего вложения с помощью Paperclip? - PullRequest
1 голос
/ 09 ноября 2010

У меня есть потоки байтов на сервере, которые я хотел бы присоединить к классу модели с помощью Paperclip, и я хотел бы иметь возможность указать имя, которое они сохраняют в файловой системе.Поскольку у меня много этих входящих файлов, я бы предпочел иметь возможность создавать их как Tempfiles, чтобы мне не приходилось беспокоиться о конфликтах имен и их удалении вручную и тому подобное.Вот что я делаю:

desired_file_name = 'foo.txt'
Tempfile.open([File.basename(desired_file_name), File.extname(desired_file_name)]) do |tf|
  tf.write(content_stream)
  tf.rewind
  model_obj.paperclip_attachment = tf
end

Это в значительной степени работает.Единственная проблема заключается в том, что мое вложение Paperclip заканчивается именем временного файла, например, foo.txt.201029392u-gyh-foh96y.txt.Итак, как я могу сказать Paperclip, что сохранить мой файл как?Звонок model_obj.paperclip_attachment_file_name = desired_file_name не работает.Поле БД сохраняется под этим именем, но в файловой системе у меня все еще есть это имя временного файла.

1 Ответ

7 голосов
/ 09 ноября 2010

Я думаю, вы можете определить свою собственную интерполяцию интерполяция , чтобы сделать это. Затем вы можете прикрепить файл в обычном режиме. Например:

# config/initializers/paperclip.rb
Paperclip.interpolates :custom_filename do |attachment, style|
  # Generate your desired file name here.
  # The values returned should be able to be regenerated in the future because
  # this will also be called to get the attachment path.

  # For example, you can use a digest of the file name and updated_at field.
  # File name and updated_at will remain the same as long as the file is not 
  # changed, so this is a safe choice.
  SHA1.sha1("#{attachment.original_filename}-#{attachment.updated_at}")
end

# app/models/post.rb
class Post < ActiveRecord::Base
  has_attached_file :attachment,
    :path => ':rails_root/public/system/:class/:attachment/:id/:style/:custom_filename',
    :url => '/system/:class/:attachment/:id/:style/:custom_filename'
end

Обратите внимание, что это только меняет имя файла в файловой системе. model.attachment_file_name или model.attachment.original_filename сохранит исходное имя файла.

...