2016-09-08 25 views
0

私はPhoenixアプリケーションにファイルアップロードを追加しました。また、コンソールでアプリを起動すると、アップロードされた画像を開発環境や本番環境でローカルに表示できます。アップロードされた画像をプロダクションに表示できません

プロダクションサーバーに画像をアップロードすると、ファイルがアップロードされて正しいディレクトリにコピーされますが、ブラウザからファイルにアクセスすることができません。

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 

アップロードモジュールをアップロードするために必要なすべてのタスクを処理し、次のようにBASE_PATHが定義されています:

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

のEnvするvar UPLOAD_PATHを次のように

私のエンドポイントのstaticプラグがありますサーバー上で次のように定義されています。

/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 

アップロードされたすべてのファイルが上記のディレクトリはうまくいきますが、ブラウザで次のように入力すると、ページが返されません。

http://[app-url]/uploads/[name-of-file-in-uploads-folder] 

開発VMとプロダクションサーバーは両方ともCentos 7であり、プロダクションアプリはNginxの背後にあります。

私はそれがすべてだと思っていますが、助けてくれればさらに詳しい情報を提供することができます。

+1

缶'Upload.base_path'が実際にあなたがそれを呼び出すときに期待するパスを返すことを確認しますか? Upload.base_path、gzip:false'のプラグインスタティック、at: "/ uploads"の前にIO.inspect(Upload.base_path)を追加し、プロダクションサーバの出力を確認してください。その行は、実行中ではなく、アプリが_compiled_のときに実行されることに注意してください。 – Dogbert

+0

こんにちは、はい、それはすでに検査しています。 Upload.base_pathは、アップロード後にtmpフォルダからファイルをコピーする際のパス(読み書きパスが同じであることを確認するため)にも使用され、ファイルは正しい場所にコピーされます。また、画像が表示されるはずのビューにパスを印刷し、正しいディレクトリを指しています。 –

+0

ドッグベルトへの謝罪、イタリック体でさえ、私は_compiled_という言葉の使用の重要性を忘れていました。あなたのコメントは、私が正しくそれを読んでいれば正しい方向に私を導くだろう。 –

答えて

1

私は同様の問題を経験したと思います。私たちは、コンパイルおよびデプロイ対象として二つの別々のサーバーを使用している

#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") 

:私の最初のアプローチはどのように見えた

。コンパイル中にパスが/home/builds/app_name/uploadsに拡張され、期待された/home/user/app_name/uploadsの代わりに動作していたため、動作しませんでした。

我々はそれを修正する方法:

今では生産のハードコードされたパスや他の場所に拡張パスを使用しています
#config/production.exs 
config :app_name, 
    full_upload_path: "/home/user/app_name/uploads" 

TLDR:あなたのリリースでコンパイルしたマシン上のUPLOAD_PATH変数を設定しよう

+0

それがそれを解決しました。私はまだRubyの用語では、実行時にconfig変数が読み込まれると考えていました。今では、開発で通常の迷惑メールユーザーを使用するのではなく、自分のVagrant VMをプロダクションサーバーと同じに設定することが、より良い解決策であると考えています。 –

関連する問題