2016-04-15 17 views
0

Ich versuche, eine Datei von einem Remote-Speicher-Dienst (nicht s3 :-)) auf den Client mit Ruby on Rails 4.2 zu streamen.Stream Remote-Datei zum Client in Ruby/Rails 4/Einhorn/Nginx

Mein Server muss in der Mitte der Dinge bleiben, um die Clientanforderung zu authentifizieren, aber auch um die Anforderung an den Remotespeicherdienst zu erstellen, da alle Anforderungen an diesen Dienst mit einem benutzerdefinierten Headerparam authentifiziert werden müssen. Dies macht es nicht möglich, eine einfache redirect_to zu machen und den Client direkt die Datei herunterladen zu lassen (aber lassen Sie mich wissen, ob dies tatsächlich mit Rails möglich ist!). Ich möchte auch die URL der Datei für den Client verborgen halten.

Bis jetzt verwende ich ein Juwel namens ZipLine, aber das funktioniert auch nicht, da es immer noch die Remote-Datei zwischenspeichert, bevor sie an den Client gesendet wird. Da ich ein Unicorn/nginx verwende, kann dies auch auf eine Einstellung in einem der beiden zurückzuführen sein, die ein ordnungsgemäßes Streaming verhindert.

Wie pro Schiene doc Anweisungen habe ich versucht, das Hinzufügen

listen 3000, tcp_nopush: false 

/unicorn.rb config, aber ohne Erfolg.

Eine Lösung könnte sein, die Remote-Datei lokal für einen bestimmten Zeitraum zwischenzuspeichern und nur diese Datei zu bedienen. Dies würde einige Dinge leichter machen, aber auch neue Kopfschmerzen wie das Erstellen der Remote-und Cache-Dateien synchron zu halten, Setzen des rechten Trigger für Cache Ablauf usw.

So zusammenzufassen:

1) Wie kann ich erreichen das obige Szenario?

2) Wenn dies keine intelligente/effiziente Methode ist, sollte ich einfach eine Remote-Kopie zwischenspeichern?

3) Was sind Ihre Erfahrungen/Empfehlungen im gegebenen Szenario?

Ich bin auf verschiedene Lösungen im Interweb gestoßen, aber keine inspirieren eine vollständige Lösung.

Danke!

+0

Hallo Corstiaan, du hast wahrscheinlich schon eine Lösung gefunden. Ich habe das gleiche Problem. hier ist mein Thread: https://stackoverflow.com/questions/45714918/download-as-attachment-not-streaming Aber in Bezug auf Zipline funktioniert es wirklich im laufenden Betrieb für mich. Ich arbeite mit Büroklammer und S3 – Maxence

Antwort

1

Ich gehe davon aus, dass der Third-Party-Speicherdienst einen HTTP-Zugriff hat. Wenn Sie in Erwägung ziehen, redirect_to zu verwenden, nehme ich an, dass der Dienst auch eine Möglichkeit bietet, die Autorisierung per Download zuzulassen. Wie ein eindeutiger Schlüssel im Header, der abläuft und Ihre geheimen API-Schlüssel oder Ihre HMAC-signierte URL nicht mit der Ablaufzeit als Parameter offen legt.

Jedenfalls bieten die meisten Cloud-Speicherdienste diese Art von Dateizugriff. Ich würde sehr empfehlen, den Service die Datei streamen zu lassen. Ihre App sollte den Nutzer lediglich autorisieren und zum Dienst weiterleiten. Mit Rails können Sie beim Weiterleiten benutzerdefinierte Header hinzufügen. Es wird in Rails guides diskutiert.

10.2.1 Festlegen eines eigenen Headers

Wenn Sie benutzerdefinierte Header auf eine Antwort festlegen möchten dann response.headers der Ort ist, es zu tun. Das headers-Attribut ist ein Hash, der die Header-Namen ihren Werten zuordnet, und Rails setzt einige davon automatisch auf .Wenn Sie einen Header hinzuzufügen oder zu ändern, weisen sie nur zu response.headers

Also Ihr Aktionscode würde, etwas am Ende wie folgt:

def download 
    # do_auth_check 

    response.headers["Your-API-Auth-Key"] = "SOME-RANDOM-STRING" 
    redirect_to url 
end 

Sie verbrauchen unnötige Server-Ressourcen nicht durch durch alle diese Downloads zu streamen. Dafür bezahlen wir Cloud-Dienste :)

+0

Danke @ Uzbekjon, aber würde dies nicht den Auth-Schlüssel für den Kunden potenziell offen legen? – Corstiaan

+0

Und die Anfrage für die Datei muss mit POST erfolgen. Das würde redirect_to ausschließen, richtig? – Corstiaan

+0

Re-Authentifizierungsschlüssel, der davon abhängt, wie Sie den Speicherdienst auth herunterladen. Zum Beispiel ermöglicht s3 Downloads mit einzigartigen Hashes, die keine geheimen Schlüsseldaten enthalten. Sie sollten also Ihre Speicherdokumente sehen. Wenn Sie POST machen müssen, dann ja, es schließt 'redirect_to' ziemlich aus. – Uzbekjon