2017-04-23 68 views
1

我試圖將圖像上傳到Heroku上的鳳凰應用程序。我有一個簡單的應用程序,遵循從Phoenix's docs上傳文件的說明。Heroku上的鳳凰文件複製

我有一個簡單的窗體,控制器使用File.cp_r()從臨時目錄複製文件。

def create(conn, %{"user" => user_params}) do 
    if upload = user_params["photo"] do 
     File.cp_r(upload.path, "priv/static/images/foo.jpg") #non-dynamic name, doens't matter 
    end 
    ... 
    end 

工作只是在我的本地文件。但是,當我上傳到Heroku,測試目錄上的表格和heroku run find,我什麼也沒看到。

我注意到,在Heroku此目錄下有一個看似令人望而卻步的特權:

drwx------ 2 u25619 dyno 4096 Apr 23 05:14 images

我想在一個漂亮的小File.chmod("priv/static/images", 0o777)下滑,但無濟於事;該目錄似乎與我無關,所以我認爲這是一個英雄問題。

任何想法如何處理?

編輯:通過使用鳳凰dep ex_aws上傳到Amazon S3存儲桶解決。

+1

試着'File.cp_r!'這會拋出一個錯誤,然後您可以在日誌中讀取它的原因。 (如果需要的話,'File.chmod!'也是如此。)如果在進行更改後發佈詳細日誌,我們可能會提供更多幫助。你也可以通過'IO.inspect(File.cp_r(...))'來記錄該函數的返回值。 – Dogbert

+1

@Dogbert'File.cp_r!'什麼也不顯示,'IO.inspect(File.cp_r(...))'顯示'{:ok,[「priv/static/images/foo.jpg」]},仍然空空如也。 –

+1

你能確認這個沒有任何回報:'heroku run find。 | grep'priv/static/images/foo.jpg''? – Dogbert

回答

2

在Heroku上的文件系統是短暫的,你不會可以訪問部署時或在啓動新實例時保存在其上的任何文件。

此外,當您運行heroku運行時,您不會連接到當前正在運行應用程序的同一實例,而是會啓動一個新實例,以便那些上傳的文件不會存在。

更好的方法是將上傳的文件保存到S3或類似的地方,您仍然可以通過部署訪問它。

+0

「heroku run」直接啓動另一個實例真的很關鍵。我甚至沒有注意到這一點,浪費了大量的時間,想知道爲什麼鳳凰沒有報告任何錯誤,但該文件沒有顯示在我的'heroku運行bash'中... –