Rails 3 - Tempfile Path?
У меня есть следующее:
attachments.each do |a|
Rails.logger.info a.filename
tempfile = Tempfile.new("#{a.filename}", "#{Rails.root.to_s}/tmp/")
Rails.logger.info tempfile.path
end
Если вложения находятся из скрепки.
Здесь вывод:
billgates.jpg
/Users/bhellman/Sites/cline/tmp/billgates.jpg20101204-17402-of0u9o-0
Почему имя файла получает 20101204-17402-of0u9o-0
в конце? Это ломает все с помощью скрепки и т.д. Кто-нибудь видел это раньше? Для жизни я понятия не имею, что это делает?
Спасибо
UPDATE
Скрепка: Скрепка на github
a - файл вложения
tempfile = Tempfile.new("#{a.filename}", "#{Rails.root.to_s}/tmp/")
tempfile << a.body
tempfile.puts
attachments.build(
:attachment => File.open(tempfile.path)
)
Ответы
Ответ 1
лучше всего убедитесь, что ваш tempfile имеет правильное расширение, что позволяет вам попробовать и изменить его после:
file = Tempfile.new(['hello', '.jpg'])
file.path # = > что-то вроде: "/tmp/hello2843-8392-92849382--0.jpg"
здесь: http://apidock.com/ruby/v1_9_3_125/Tempfile/new/class
Ответ 2
Первый аргумент для Tempfile.new - это просто базовое имя. Чтобы убедиться, что каждый Tempfile уникален, символы добавляются в конец файла.
Ответ 3
Для этого вам следует использовать API-интерфейс Paperclip:
tempfiles = []
attachments.each do |a|
# use Attachment#to_file to get a :filesystem => file, :s3 => tempfile
tempfiles << a.to_file
end
tempfiles.each do |tf|
Rails.logger.debug tf.filename
end
Ответ 4
attachment = attachments.build(
:attachment => File.open(tempfile.path)
)
# change the displayed file name stored in the db record here
attachment.attachment_file_name = a.filename # or whatever else you like
attachment.save!
Ответ 5
Лучший способ найти это - указать расширение файла в атрибуте Paperclip. Например:
has_attached_file :picture,
:url => "/system/:hash.jpg",
:hash_secret => "long_secret_string",
:storage => :s3,
:s3_credentials => "#{Rails.root}/config/s3.yml"
Обратите внимание, что: url объявлен как ".jpg", а не традиционный .:extension
.
Удачи!