2016-09-08 6 views
0

Ich habe den Datei-Upload zu einer Phoenix App hinzugefügt und kann das hochgeladene Bild in der Entwicklung und auch in der Produktion lokal anzeigen, wenn die App in der Konsole gestartet wird.Das hochgeladene Bild kann nicht in der Produktion angezeigt werden

Mein spezifisches Problem ist, dass wenn ich ein Bild auf den Produktionsserver hochladen, die Dateien hochgeladen und in das richtige Verzeichnis kopiert werden, aber ich kann nicht über den Browser zugreifen.

Die Static-Stecker in meinem Endpoint sind wie folgt:

plug Plug.Static, 
    at: "/", from: :bookingmot, gzip: false, 
    only: ~w(css fonts images js html favicon.ico robots.txt) 

plug Plug.Static, at: "/uploads", from: Upload.base_path, gzip: false 

Der Upload-Modul alle Aufgaben für den Upload benötigt Griffe und base_path ist wie folgt definiert:

def base_path do 
    System.get_env("UPLOAD_PATH") 
end 

Das env var UPLOAD_PATH ist auf dem Server definiert als:

/home/[username]/www/phoenix/[app-name]/uploads 

# to clarify, the contents of [app-name] are the results of 
# tar xfz app-release.tar when deploying 

Alle hochgeladenen Dateien werden in die kopiert über Verzeichnis fein, aber wenn ich dann folgendes in den Browser gebe ich bekomme nur Seite nicht gefunden zurückgegeben.

Die Entwicklungs-VM und der Produktionsserver sind beide Centos 7 und die Produktions-App befindet sich hinter Nginx.

Ich denke, das ist alles, aber ich bin glücklich, weitere Informationen zu liefern, wenn es hilft.

+1

kompilieren bestätigen Sie, dass "Upload.base_path" tatsächlich den Pfad zurückgibt, den Sie erwarten, wenn Sie ihn aufrufen? Fügen Sie 'IO.inspect (Upload.base_path) 'vor' plug Plug.Static, unter: "/ uploads", hinzu: Upload.base_path, gzip: false' und überprüfen Sie die Ausgabe auf dem Produktionsserver. Beachten Sie, dass diese Zeile ausgeführt wird, wenn die App _compiled_ wird, nicht wenn sie ausgeführt wird. – Dogbert

+0

Hi, ja das tut es, schon mal inspiziert. Upload.base_path wird auch für den Pfad verwendet, wenn die Datei nach dem Upload aus dem tmp-Ordner kopiert wird (um sicherzustellen, dass Lese- und Schreibpfad identisch sind) und die Datei an den richtigen Speicherort kopiert wird. Ich druckte auch den Pfad in der Ansicht, in der das Bild angezeigt werden soll, und es zeigt auf das richtige Verzeichnis. –

+0

Ich entschuldige mich bei Dogbert, sogar in Kursivschrift, ich vermisste die Bedeutung der Verwendung des Wortes _compiled_, sorry. Dein Kommentar hätte mich in die richtige Richtung geführt, wenn ich es richtig gelesen hätte. –

Antwort

1

Ich glaube, ich habe ein ähnliches Problem erlebt.

Wie mein erster Ansatz sah aus wie:

#lib/endpoint.ex 
plug Plug.Static, 
    at: "/uploads", 
    from: Application.get_env(:app_name, :full_upload_path), 
    gzip: false 

#config/config.exs 
config :app_name, 
    full_upload_path: Path.expand("./uploads") 

Wir sind mit zwei separaten Servern für die Kompilierung und als deploy Ziel. Es funktionierte nicht, weil während der Kompilierung der Pfad zu /home/builds/app_name/uploads statt der erwarteten /home/user/app_name/uploads erweitert wurde.

Wie wir es fest:

#config/production.exs 
config :app_name, 
    full_upload_path: "/home/user/app_name/uploads" 

Jetzt wird es mit fest codierten Pfad in der Produktion und erweitert Weg anderswo

TLDR: versuchen UPLOAD_PATH Variable auf der Maschine zu setzen, auf dem Sie Ihre Freilassung

+0

Das hat es gelöst. Ich dachte immer noch in Ruby-Begriffen, dass die Konfigurations-Vars zur Laufzeit gelesen würden. Jetzt denke ich, eine bessere Lösung könnte sein, meine Vagrant VM genau so einzustellen wie meinen Produktionsserver, anstatt den normalen vagabunden Benutzer in der Entwicklung zu verwenden. –

Verwandte Themen