2016-07-12 1 views
0

Я хотел бы получить тип содержимого удаленного файла, потому что у меня есть проблема при его загрузке. Тип контента неверен. Вот мой код, чтобы загрузить файлТип содержимого удаленного файла

url = "http://my_url/my_file.mp4" 
file = open(URI::encode(url)) 
content_type = file.content_type # => text/plain instead of video/mpeg or video/mp4 

Я попытался следующий код, чтобы получить CONTENT_TYPE раньше, но до сих пор не работает:

url = URI.parse(url) 
Net::HTTP.start(url.host, url.port){|http| http.head(url.request_uri)['Content-Type']} 

Кто-нибудь есть идеи?

Редактировать

Вот код, я использую, чтобы выяснить, какие CONTENT_TYPE это ..

MIME::Types.type_for(URI::encode(url)).map{|type| type.content_type}.join(' ') 
# => "application/mp4 audio/mp4 video/mp4 video/vnd.objectvideo" 

Но вот результат с видео со звуковой дорожкой .. Как я полагаю, только розовое "видео/mp4"? Я не могу проверить каждый тип файла, чтобы узнать, какой результат. Это бесконечно.

+0

Вы пытаетесь выяснить, что это за файл, или значение заголовка Content-Type, возвращаемого сервером? –

+0

Примечание: Обычно лучше писать 'URI.encode (...)'. Навигатор '::' namespace предназначен для модулей, классов и констант. – tadman

+0

@Jordan Я пытаюсь узнать Content-Type. В принципе, я хотел бы быть уверенным, что загруженный файл является тем, кем он должен быть ... Согласно этому типу содержимого я создам экземпляр модели X или Y. – BriceB

ответ

1

Серверы не обязаны сообщать вам правильный тип контента, и во многих случаях они ошибаются, потому что это обычно не важно. Большинство браузеров обеспечивают значительную свободу действий над тем, что они будут принимать и обрабатывать.

Единственный способ узнать наверняка - это вытащить файл и использовать инструмент, например, file, чтобы изучить его. У этого есть довольно большая база данных различных форматов файлов и способов их идентификации.

В результате вашего запроса может быть сообщение об ошибке HTML. Вы не узнаете, пока не проверите содержимое файла.

+0

Вот что я подумал, но когда я открываю (..) «Я создаю временный файл. Я проверяю тип содержимого этого временного файла, но он плохой. Должен ли я точно знать тип содержимого того, что я буду загружать, прежде чем загружать его? – BriceB

+1

Это грязный мир, поэтому вы не можете быть уверены, что получите, запрашивая произвольный URL-адрес. Если у вас есть контроль над сервером и его правильная настройка, тогда он в основном соответствует именам файлов и типам MIME, поэтому это может быть неправильно. – tadman

+0

FWIW вы можете нажимать 'curl' или' wget' на 'файл', и труба будет короткозамкнута, как только' file' сможет ее идентифицировать, поэтому вам не нужно загружать весь файл: 'wget --quiet - O - http: // ... | file -' или 'curl --silent --location http: // ... | file -' (опция '--location' cURL сообщает, что она выполняет переадресацию, Wget делает это автоматически). –

 Смежные вопросы

  • Нет связанных вопросов^_^