In PHP möchte ich eine S3-Datei in den Browser herunterladen, ohne sie auf meinem Server zu speichern

StackOverflow https://stackoverflow.com/questions/772505

Frage

Ich habe Dateien auf Amazons S3.Sie werden mit einer eindeutigen ID benannt, sodass es keine Duplikate gibt.Ich greife über eine autorisierte URL darauf zu.Ich muss sie an den Browser weiterleiten können, aber ich muss sie umbenennen.Im Moment verwende ich fopen, aber es lädt die Datei auf meinen Server herunter, bevor sie dem Browser bereitgestellt wird.Wie kann ich dafür sorgen, dass die Dateien über meinen Server an den Browser weitergeleitet werden?Oder wie puffere ich den Download, indem ich einen kleinen Teil auf meinen Server herunterlade und diesen an den Browser übergebe, während ich den nächsten Teil herunterlade?

Außerdem würde ich CloudFront wirklich gerne verwenden, aber sie bieten keine authentifizierten URLs an.Ich glaube, ich kann CURL verwenden, um Anmeldeinformationen für die Anfrage zu senden. Kann ich diese Art der „Pass-Through“-Dateibereitstellung mit CURL durchführen?

Danke!

War es hilfreich?

Lösung

Ich bin mit der Funktionsweise von S3 nicht vertraut und weiß daher nicht, ob diese Lösung möglich ist.Aber könnte man den Browser des Benutzers nicht einfach auf die Datei umleiten?Wenn ich das richtig verstehe, können Sie mit S3 Web-URLs für alle Dateien in Ihrem Bucket erstellen.Wenn es sich also beispielsweise um kostenpflichtige Downloads handelt, dann könnten Sie das tun Lassen Sie S3 eine temporäre URL für diesen Download generieren und entfernen Sie es dann, sobald der Benutzer es heruntergeladen hat.

Wenn das keine Option ist, können Sie diese PHP-Klassen ausprobieren:

  • HTTP-Protokoll-Client – Eine Klasse, die Anforderungen an HTTP-Ressourcen implementiert (wird vom folgenden Stream-Wrapper verwendet).Ermöglicht das Streamen von Anfragen.
  • gHttp – Ein HTTP-Stream-Wrapper, mit dem Sie Remote-HTTP-Ressourcen als Dateien behandeln können, indem Sie Funktionen wie verwenden fopen(), fread(), usw.
  • Amazon S3 Stream Wrapper – Ein Amazon S3-Stream-Wrapper vom selben Entwickler wie gHttp.Ermöglicht außerdem den Zugriff auf Remote-Ressourcen wie auf normale Dateien über fopen('s3://...').

Bearbeiten:

Diese Seite verfügt über Informationen zur „Vorauthentifizierung“ einer Anfrage durch Kodierung des Authentifizierungsschlüssels in der URL.Es befindet sich im Abschnitt mit dem Titel: Alternative zur Authentifizierung mit Abfragezeichenfolge.

// I'm only implementing the parts required for GET requests.
// POST uploads will require additional components.
function getStringToSign($req, $expires, $uri) {
   return "$req\n\n\n$expires\n$uri";
}

function encodeSignature($sig, $key) {
    $sig = utf8_encode($sig);
    $sig = hash_hmac('sha1', $sig, $key);
    $sig = base64_encode($sig);
    return urlencode($sig);
}

$expires = strtotime('+1 hour');
$stringToSign = getStringToSign('GET', $expires, $uri);
$signature = encodeSignature($stringToSign, $awsKey);

$url .= '?AWSAccessKeyId='.$awsKeyId
       .'&Expires='.$expires
       .'&Signature='.$signature;

Dann leiten Sie den Benutzer einfach weiter $url, und sie sollten in der Lage sein, die Datei herunterzuladen.Die Signatur wird durch ein Einweg-Verschlüsselungsschema (sha1) verschlüsselt, sodass kein Risiko besteht, dass Ihr AWS Secret Access Key preisgegeben wird.

Andere Tipps

Haben Sie versucht, HTTP_GET verwenden, mit request_options die httpauth angeben und httpauthtype? Obwohl ich mich nicht erinnern, ob diese Methode eine Zeichenfolge gültigen Typen geht davon aus, die möglicherweise nicht für gut binär arbeiten.

Wenn das erfolgreich ist, dann sollten Sie in der Lage sein, den richtigen MIME-Typen zur Verfügung zu stellen und an den Browser schreiben.

Haben Sie versucht, bu nur ReadFile- mit ( " http: // username: password @ host / Dateiname. ext ")?

Das wird nur Bypass und schreiben Sie direkt an den Output aber wenn Inhaltstyp von Belang ist, dass Sie zunächst überprüfen müssen.

Mit en-URL als Argument ReadFile- erfordert auch, dass PHP mit urlwrapper-Unterstützung kompiliert wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top