Переопределение content_type для плагина Rails Paperclip - PullRequest
6 голосов
/ 06 апреля 2010

Думаю, у меня проблемы с курицей и яйцом. Я хотел бы установить content_type файла, загруженного через Paperclip. Проблема в том, что тип содержимого по умолчанию основан только на расширении, но я бы хотел использовать его для другого модуля.

Мне кажется, что я могу установить тип содержимого с помощью before_post_process

class Upload < ActiveRecord::Base 
  has_attached_file :upload
  before_post_process :foo

  def foo
    logger.debug "Changing content_type"

    #This works
    self.upload.instance_write(:content_type,"foobar")

    # This fails because the file does not actually exist yet
    self.upload.instance_write(:content_type,file_type(self.upload.path)
  end

  # Returns the filetype based on file command (assume it works)
  def file_type(path)
    return `file -ib '#{path}'`.split(/;/)[0]
  end
end

Но ... я не могу основать тип содержимого на файле, потому что Paperclip не записывает файл до after_create.

И я не могу установить content_type после того, как он был сохранен или с обратным вызовом after_create (даже обратно в контроллер)

Итак, я хотел бы знать, могу ли я каким-то образом получить доступ к реальному объекту файла (предположим, что процессоры ничего не делают с исходным файлом) до его сохранения, чтобы я мог выполнить команду file_type для этого. Или есть способ изменить content_type после того, как объекты были созданы.

1 Ответ

4 голосов
/ 28 апреля 2010

Возможно, вы могли бы использовать upload.to_file. Это дает вам временный файл скрепки (Paperclip::Tempfile). Он имеет свойство path, поэтому вы можете использовать

self.upload.instance_write(:content_type,file_type(self.upload.to_file.path)

Вы можете получить Tempfile, используя upload.to_file.to_tempfile

...