So erhalten Sie die öffentliche URL einer hochgeladenen Datei in Laravel 5

9

Wie Sie vielleicht wissen, verwendet Laravel das Flysystem PHP-Paket, um die Abstraktion von Dateisystemen zu ermöglichen. Ich habe begonnen, diese Funktion in meinem Projekt zu verwenden, nur zum Spaß einige Bilder in meine Amazon S3-Bucket hochgeladen, ich habe auch eine Instanz von Cloudfront mit diesem Bucket verbunden. Mein Problem ist, wenn ich versuche, diese Bilder in meiner HTML-Seite anzuzeigen, brauche ich eine URL.

Ich konnte keinen "sauberen" Weg finden, es zu tun, da flyssystem eine generische Bibliothek ist, durch die ich in der Lage bin, etwas in der Art zu tun:

%Vor%

für 'öffentliche' Dateien und es ist einfach zu bestimmen, ob die Datei "öffentlich" ist oder nicht, weil sie in ihrer API enthalten ist. Wenn ich also s3 bucket als Treiber für die Platte verwende, sollte ich folgendes bekommen: " Ссылка "

oder alternativ:

%Vor%

für 'private' Dateien - ich sollte eine temporäre URL bekommen, die nach einiger Zeit abläuft.

Kann ich das nur mit einer konkreten Umsetzung erreichen? zum Beispiel, wenn ich Amazon S3 benutze, kann ich leicht laufen:

%Vor%

Aber ich möchte nicht hässliche "Wechselfälle" machen, um zu bestimmen, welchen Treiber ich benutze. Und wie bekomme ich eine URL von einer CDN (wie Cloudfront) über die FileSystem-Schnittstelle? Irgendwelche Vorschläge?

    
Lihai 22.04.2015, 10:06
quelle

1 Antwort

3

Ich denke an Flysystem als Schnittstelle zu einer Festplatte (oder einem anderen Speichermechanismus) und nicht mehr. Genauso wie ich mein lokales Dateisystem nicht bitten würde, einen öffentlichen URI zu berechnen, würde ich auch Flysystem nicht darum bitten.

Ich erstelle Objekte, die den Dateien entsprechen, die ich über Flysystem gespeichert habe. Je nach meinen Anforderungen kann ich den öffentlichen URI direkt im Datenbankeintrag speichern oder einen benutzerdefinierten Getter erstellen, der den öffentlichen URI basierend auf den Laufzeitbedingungen erstellt.

Mit Flysystem kenne ich den Pfad zur Datei, wenn ich die Datei schreibe. Um diese Dateien im Auge zu behalten, erstelle ich normalerweise ein Objekt, das eine gespeicherte Datei darstellt:

%Vor%

Wenn ich die Datei speichere, erstelle ich einen Datensatz in der Datenbank:

%Vor%

Wenn ich den öffentlichen URI benötige, kann ich ihn einfach aus dem SavedFile -Modell entfernen. Dies ist praktisch für triviale Anwendungen, aber es bricht zusammen, wenn ich Speicheranbieter wechseln muss.

Hebelvererbung

Ein weiterer netter Trick besteht darin, eine Methode zu definieren, die den öffentlichen URI basierend auf einer Variablen auflöst, die im untergeordneten Element eines abstrakten SavedFile -Modells definiert ist. Auf diese Weise kodiere ich den URI in der Datenbank nicht hart, und ich kann neue Klassen für andere Speicherdienste mit nur ein paar Variablendefinitionen erstellen:

%Vor%

Wenn ich jetzt eine Reihe von Dateien auf meinem lokalen Dateisystem gespeichert habe und sie eines Tages zu Amazon S3 verschoben habe, kann ich einfach die Dateien kopieren und die Abhängigkeiten in meinen IoC-Bindungsdefinitionen austauschen und fertig. Kein zeit- und potentiell gefährliches Suchen und Ersetzen in einer umfangreichen Datenbanktabelle erforderlich, da die Berechnung der URI vom Modell durchgeführt wird:

%Vor%

Bearbeiten:

Unterstützung für öffentliche und private Dateien

Fügen Sie dem Objekt einfach eine Markierung hinzu:

%Vor%     
Ben Harold 22.04.2015 23:26
quelle

Tags und Links