Я думаю, что у меня есть определенная проблема курицы и яйца. Я хотел бы установить content_type файла, загруженного через Скрепку. Проблема состоит в том, что значение по умолчанию content_type только основано на расширении, но я хотел бы основывать его на другом модуле.
Я, кажется, могу установить content_type с 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
Но... Я не могу основывать тип контента на файле, потому что Скрепка не пишет файл до after_create.
И я, может казаться, не устанавливаю content_type после того, как он был сохранен или с after_create обратным вызовом (даже назад в контроллере)
Таким образом, я хотел бы знать, могу ли я так или иначе добраться, доступ к фактическому объекту файла (предположите, что нет никаких процессоров, делающих ничто в исходный файл), прежде чем он будет сохранен, так, чтобы я мог выполнить команду file_type на этом. Или есть ли способ изменить content_type после того, как объекты были созданы.
Возможно, вы могли бы использовать 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