Rails 3 - Путь к временному файлу?

У меня есть следующее:

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? Это ломает все скрепкой и т. д. Кто-нибудь видел это раньше? Для жизни я понятия не имею, что это делает?

Спасибо

ОБНОВЛЕНИЕ Скрепка: Paperclip на github

а файл вложения

tempfile = Tempfile.new("#{a.filename}", "#{Rails.root.to_s}/tmp/")
tempfile << a.body
tempfile.puts
attachments.build(
    :attachment => File.open(tempfile.path)
)

person AnApprentice    schedule 05.12.2010    source источник
comment
Почему бы просто не использовать File.new вместо Tempfile.new?   -  person Ryan Bigg    schedule 05.12.2010
comment
Хороший вопрос. Он должен быть дружественным к Heroku, и их документы говорят использовать временный файл?   -  person AnApprentice    schedule 05.12.2010
comment
Не сломается ли File.New в случае конфликта?   -  person AnApprentice    schedule 05.12.2010


Ответы (5)


лучше всего убедиться, что ваш временный файл имеет правильное расширение, что избавит вас от попыток изменить его после:

файл = Tempfile.new(['привет', '.jpg'])

file.path # => что-то вроде: /tmp/hello2843-8392-92849382--0.jpg

подробнее здесь: http://apidock.com/ruby/v1_9_3_125/Tempfile/new/class< /а>

person andistuder    schedule 16.08.2012

Первый аргумент для Tempfile.new — просто базовое имя. Чтобы убедиться, что каждый временный файл уникален, символы добавляются в конец файла.

person drummondj    schedule 05.12.2010
comment
Спасибо, Джон, но это ломает Paperclip, который затем делает :attachment => File.open(tempfile.path), как я могу отправить этот временный файл в paperclip без всей случайности, добавленной к имени файла? Благодарность - person AnApprentice; 05.12.2010
comment
Я не уверен, что вы пытаетесь сделать со скрепкой. Вы пытаетесь изменить путь по умолчанию? - person drummondj; 05.12.2010
comment
Вот что у меня сейчас есть в Paperclip: :attachment => File.open(tempfile.path). Проблема в том, что paperclip использует имя временного файла при загрузке файла на s3. Поэтому имя файла необходимо очистить/исправить перед отправкой в ​​скрепку. - person AnApprentice; 05.12.2010
comment
Можете ли вы отправить скрепке данные временного файла и указать имя файла для использования? Примерно так: :attachment => send_data File.open(tempfile.path), :filename => thefile.extttt - person AnApprentice; 05.12.2010
comment
Можете ли вы опубликовать код, где вы использовали опцию :attachment. Я не знаком с этим вариантом. - person drummondj; 05.12.2010
comment
Я предлагаю вам использовать File.new и убедиться, что имя файла еще не существует. Используйте #{Rails.root.to_s}/tmp/#{n}/#{a.filename}, где n — целое число. Начните с n = 0 и увеличивайте, пока файл не перестанет существовать. - person drummondj; 05.12.2010

Для этого вы должны использовать 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
person yfeldblum    schedule 05.12.2010
comment
Я не понимаю, что меняется с приведенным выше предложением? Что делается, чтобы избежать сумасшедшего случайного имени файла, заданного Tempfile? - person AnApprentice; 05.12.2010
comment
Я думал, что ваша проблема заключалась в том, что когда вы вытаскивали файлы из хранилища, у временных файлов были странные имена файлов. - person yfeldblum; 05.12.2010
comment
Я создаю временный файл, а затем отправляю его в скрепку, чтобы сохранить вложение через (:attachment => File.open(tempfile.path), именно там скрепка получает имя файла из временного файла. точка из tempfile. имеет всю случайность в конце - person AnApprentice; 05.12.2010
comment
проблема заключается в отправке временного файла в скрепку для сохранения таким образом, чтобы у него было не сумасшедшее имя файла, а исходное имя файла, чтобы скрепки правильно сохраняли его на S3. это помогает? - person AnApprentice; 05.12.2010

Я нашел лучший способ справиться с этим, указав расширение файла в атрибуте 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.

Удачи!

person Chris Nolet    schedule 28.05.2012

person    schedule
comment
пробовал, но проблема в том, что имя файла на S3 не обновляется. просто имя файла в базе данных, что, по существу, делает ссылку недействительной, и файл теряется. - person AnApprentice; 05.12.2010
comment
Либо измените имя файла перед сохранением записи, либо не включайте имя файла из временного файла в имя файла, как его видит S3. - person yfeldblum; 05.12.2010