2016-07-12 21 views
0

Ich möchte den Inhaltstyp einer entfernten Datei erhalten, weil ich ein Problem habe, wenn ich es herunterladen. Der Inhaltstyp ist falsch. Hier ist mein Code eine DateiInhaltstyp einer entfernten Datei

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 

Ich habe versucht, den folgenden Code zum Download der content_type zu erhalten, bevor aber immer noch nicht funktioniert:

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

Hat jemand eine Idee?

bearbeiten

Hier ist der Code, den ich, um herauszufinden, zu benutzen, die content_type es ist ..

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

Aber hier ist das Ergebnis mit einem Video mit Tonspur .. Wie bin ich nehme an nur pink "video/mp4"? Ich kann nicht jeden Dateityp überprüfen, um zu sehen, was das Ergebnis ist. Es ist endlos.

+0

Möchten Sie herausfinden, um welche Art von Datei es sich handelt oder welchen Wert der vom Server zurückgegebene Content-Type-Header hat? –

+0

Hinweis: Es ist generell besser, 'URI.encode (...)' zu schreiben. Der Namespace-Navigator '::' ist für Module, Klassen und Konstanten gedacht. – tadman

+0

@Jordan Ich versuche den Content-Type zu kennen. Grundsätzlich möchte ich sicher sein, dass die hochgeladene Datei das ist, was sie sein soll. Gemäß diesem Inhaltstyp instanziiere ich X- oder Y-Modell. – BriceB

Antwort

1

Server sind nicht verpflichtet, Ihnen den richtigen Inhaltstyp zu nennen, und in vielen Fällen werden sie es falsch verstehen, weil das normalerweise nicht wichtig ist. Die meisten Browser bieten einen erheblichen Spielraum für die Akzeptanz und Verarbeitung.

Die einzige Möglichkeit, um sicher zu wissen, ist, die Datei herunterzuziehen und ein Tool wie file zu verwenden, um es zu untersuchen. Dies hat eine ziemlich große Datenbank mit verschiedenen Dateiformaten und Möglichkeiten, sie zu identifizieren.

Das Ergebnis Ihrer Anfrage könnte eine HTML-Fehlermeldung sein. Sie werden es nicht wissen, bis Sie den Inhalt der Datei verifiziert haben.

+0

Das dachte ich mir aber wenn ich "open (..)" mache, erstelle ich eine temporäre Datei. Ich überprüfe den Inhaltstyp dieser temporären Datei, aber es ist ein schlechter. Erlaube ich, genau zu wissen, welchen Inhaltstyp ich herunterladen werde, bevor ich ihn herunterlade? – BriceB

+1

Es ist eine unordentliche Welt, so dass Sie nicht sicher sein können, was Sie bekommen werden, wenn Sie eine beliebige URL anfordern. Wenn Sie die Kontrolle über den Server haben und ihn sogar richtig konfigurieren, dann stimmt das meistens mit Dateinamen im Vergleich zu MIME-Typen überein, also könnte es falsch sein. – tadman

+0

FWIW Sie können 'curl' oder' wget' in 'file' pipen und die Pipe wird kurzgeschlossen, sobald' file' sie identifizieren kann, so dass Sie nicht die ganze Datei herunterladen müssen: 'wget --quiet - O - http: // ... | Datei-'oder' curl --silent --location http: // ... | file -' (cURLs '--location' Option sagt, dass es Umleitungen folgen soll; Wget macht das automatisch). –