Laravel Liga/flysystem abrufen von Datei-URL mit AWS S3
Ich versuche zu bauen, ein Datei-management-system in Laravel basiert auf Liga/flysystem: https://github.com/thephpleague/flysystem
Ich bin mit dem S3-adapter, und ich habe es die Arbeit zum speichern der hochgeladenen Dateien verwenden:
$filesystem->write('filename.txt', 'contents');
Nun komme ich nicht weiter auf die Erstellung des Datei herunterladen URL bei der Verwendung der S3-adapter.
Gesichert werden die Dateien korrekt in den S3-bucket, ich habe die Berechtigungen zum Zugriff auf Sie, ich weiß nur nicht, wie man die S3 getObjectUrl Methode durch die Liga/flysystem Paket.
Habe ich versucht:
$contents = $filesystem->read('filename.txt');
aber das gibt den Inhalt der Datei.
$contents = $filemanager->listContents();
oder
$paths = $filemanager->listPaths();
aber Sie geben mir die relativen Pfade zu meinen Dateien.
Was ich brauche, ist so etwas wie das "ht...//[s3-region].amazonaws.com/[Eimer]/[Verzeichnis]/[Datei]..."
InformationsquelleAutor Ioana Cucuruzan | 2014-08-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir nicht sicher, was die richtige Weg dies zu tun ist mit Flysystem, aber die zugrunde liegenden
S3Client
- Objekt hat eine Methode, dies zu tun. Sie konnte tun$filesystem->getAdapter()->getClient()->getObjectUrl($bucket, $key);
. Natürlich, der Aufbau der URL ist so trivial wie du Sie beschrieben hast, so brauchst du nicht unbedingt eine spezielle Methode, es zu tun.Dies funktioniert nur, wenn Sie Ihre S3-Dateien sind öffentlich zugänglich
Falsch. Wenn ich die privaten Vermögen auf S3 und ich gewähre anzeigen von Berechtigungen für einen bestimmten Benutzer oder eine Gruppe auf S3, und dann benutze ich die API-Token für die Benutzer/Gruppe Erlaubnis in meinem web-app, web-app kann auf die Dateien zugreifen, auch wenn Sie privat, um alle anderen. Alternativ könnte ich die sperren alle Vermögenswerte und aktivieren Sie meine domain in der Lage sein, die Vermögenswerte über die CORS-Einstellungen im S3.
InformationsquelleAutor
Bin ich mit Laravel 5.2 und den code unten schien zu funktionieren.
Dies sollte die richtige Antwort in Laravel >= 5.2 mindestens. Der Cloud-Gruppe konfiguriert ist config/filesystems.php und der Standardwert ist 's3'
InformationsquelleAutor
Beim Update auf Laravel 5.1 diese Methode nicht mehr unterstützt durch den adapter. Nicht in deiner config müssen Sie den S3_REGION festlegen, oder Sie bekommen einen ungültigen Hostnamen Fehler und zweitens hatte ich die Verwendung des Befehls als Eingabe zum erstellen der presignedRequest.
getClient()
er ist eigentlich immer dieAws\S3\S3Client
Objekt. Jetzt ist er gerade mit dercreatePresignedRequest()
Methode aus der Amazon-Bibliothek. Also, eigentlich ist es wirklich cool, dass Sie in der Lage, die low-level-Bibliotheken, die Flysystem auf gebaut ist.Ich bin mit einem Lumen 5.1 installieren, und die akzeptiert
getObjectUrl()
Antwort noch funktioniert. Nicht sicher, welche Probleme Sie ausgeführt wurden. Es hat nichts zu tun mit Laravel sowieso. Als ich erklärte Andrew vor, Sie sind nur über die Amazon S3-Bibliothek. Laravel hat eigentlich nichts damit zu tun, wenn Sie Graben, tief und werden mit dem adapter direkt an.nicht wieder eine unterzeichnete Anfrage. Es sei denn, alle Ihre S3-Dateien sind öffentlich, das ist wahrscheinlich nicht eine gute Idee, die Sie haben, um eine presigned Anfrage
Der Benutzer hat nicht Fragen, für eine signierte URL. In der Tat, am Ende die Frage, die der Benutzer ausdrücklich das format, das wollte Sie für die URL (die war nicht einer signierten URL, format). Auch Stimme ich mit Ihrer Einschätzung, dass die pre-signed-Mechanismus ist der einzige Weg, um Zugriff auf private Vermögenswerte auf S3. Sie können auch gewähren Sie bestimmten Benutzern/Gruppen/Apps Zugriff (via API-Token), und Sie kann ermöglichen, Vermögenswerte, die für eine bestimmte Domäne mit CORS. Während Ihrem privaten Vermögen für alle anderen.
Ich habe nie gesagt, der user fragte nach einer signierten URL, es ist nur ein Kommentar, die anderen Menschen, die finden, diese Frage.
InformationsquelleAutor
Vielleicht bin ich ein wenig spät für diese Frage, aber hier ist ein Weg, um Laravel 5 integrierten Dateisystem.
Erstellte ich eine Manager-Klasse, die Sie erweitert Laravel ist FilesystemManager zu handhaben, die öffentliche url-Abruf:
Dann habe ich noch diese Klasse die AppServiceProvider unter der register-Methode, so hat er Zugriff auf die aktuellen app-Instanz:
Schließlich, für einfache statische zugreifen, habe ich mir eine Fassade-Klasse:
Nun, kann ich die öffentliche url für meine öffentliche Objekte auf meinem lokalen und s3-Dateisysteme (beachten Sie, dass ich nicht alles hinzufügen, was für ftp-oder rackspace in der FilesystemPublicUrlManager):
InformationsquelleAutor
Andere form der Lagerung::cloud():
InformationsquelleAutor