Ruby - Wie bekomme ich den Namen einer Datei mit open-uri?

8

Ich möchte eine Musikdatei auf diese Weise herunterladen:

%Vor%

In diesem Beispiel möchte ich "Test.wav" in den echten Dateinamen ändern (wie zum Beispiel das JDownloader-Programm).

EDIT : Ich meine nicht die temporale Datei, ich meine die gespeicherte Datei im Web wie Jdownloader: "Cohete Amigo - Stereo Foo.wav"

Danke fürs Lesen

UPDATE:

Ich habe versucht, den Namen zu speichern:

%Vor%

Ich denke, das hat keinen Sinn, aber ich kenne den Weg nicht, Entschuldigung.

    
ElektroStudios 15.11.2012, 08:21
quelle

2 Antworten

15

Der Dateiname wird im Header-Feld Content-Disposition gespeichert. Das Entschlüsseln dieses Feldes kann jedoch ein wenig schwierig sein. Sehen Sie sich hier einige Beispiele an:

Wie der Dateiname codiert wird Parameter des Content-Disposition Headers in HTTP?

Für open-uri können Sie auf alle Headerfelder über die meta Accessor der zurückgegebenen Klasse File :

%Vor%

Um so etwas zu entschlüsseln, könntest du das tun:

%Vor%

Es funktioniert für Ihren speziellen Fall, und es funktioniert auch, wenn die Zitate " nicht vorhanden sind. Aber in den komplexeren Fällen der Inhaltsdisposition wie UTF-8-Dateinamen könnten Sie in ein paar Schwierigkeiten geraten. Nicht sicher, wie oft UTF-8 verwendet wird und ob sogar Soundcloud UTF-8 verwendet. Vielleicht müssen Sie sich also keine Sorgen machen (nicht bestätigt oder getestet).

Sie könnten auch ein fortgeschritteneres Web-Crawler-Framework wie Mechanize verwenden und darauf vertrauen die Dekodierung für dich:

%Vor%     
Casper 15.11.2012, 09:05
quelle
6

File.basename(open(source_url)) funktioniert nicht, weil open(source_url) ein E / A-Handle einer bestimmten Art liefert, nicht eine Zeichenkette wie File.basename erwartet.

%Vor%

hätte eine bessere Chance zu arbeiten, wenn die URL nicht eine path/to/service/with/parameters/in/line/like/this -Typ-Codierung verwendet.

Rubys URI-Bibliothek hat jedoch nützliche Tools, die hier helfen können. Etwas wie:

%Vor%

wäre ein Ausgangspunkt. Zum Beispiel:

%Vor%

und:

%Vor%
  

Weißt du, ob ich die Dateigröße auch wieder abrufen kann und wie?

Eine gute Möglichkeit, HTTP-Dateien lokal zu testen, besteht darin, gem server über die Befehlszeile auszuführen. und lass Gemeine einen kleinen Webserver für seine Dokumentation starten:

%Vor%

Wenn Sie einen Block mit OpenURIs open Befehl, es gibt Ihnen Zugriff auf viele Informationen über die Verbindung in der Block-Variable, die eine Instanz der Tempfile Klasse. So können Sie die Größe der eingehenden Datei mit size herausfinden.

Das ist in Ordnung für kleine Dateien, aber wenn Sie eine große Datei einlesen, sollten Sie Net :: HTTP untersuchen, um eine head Anfrage, welche könnte die Größe enthalten. Ich sage könnte , weil der Server manchmal nicht weiß, wie viel zurückgegeben wird, im Falle von dynamischem Inhalt oder Inhalt, der von einem CGI oder Sub-Service zurückgegeben wird, der sich nicht darum kümmert .

Der Vorteil der Verwendung einer "Kopf" -Anforderung ist, dass der Server nicht den gesamten Inhalt, sondern nur die Header zurückgibt. In der Vergangenheit habe ich also eine Anfrage mit head eingefügt, um zu sehen, ob ich die benötigten Daten bekommen könnte. Wenn nicht, wäre ich gezwungen, die volle Antwort mit einem normalen get zu ziehen.

    
the Tin Man 15.11.2012 14:08
quelle

Tags und Links