2013-11-27 22 views
2

我的應用程序是在Heroku上,我從我的應用程序的一個Excel如何堅持兩個動作之間的臨時文件

用戶的輸入創建資源可以導入從Excel電子表格的接觸。進行導入的過程有多個步驟,以方便用戶的大腦。在第一步中,他們上傳一個文件(電子表格)。在第二步中,他們選擇一些選項來處理文件。這兩個步驟不能合併爲一個,因爲這些選項取決於文件的標題。

現在,這是通過兩個操作完成的:一個POST上傳文件,然後另一個POST上傳用戶的選擇。該文件作爲臨時文件實例化,不會在操作中持續存在。

所以,我不希望用戶在中介操作中再次上傳第一個文件。這可能嗎?

第一步:

= simple_form_for [:choose_headers, @contact_import] do |f| 
    = f.input :file, as: :file 
    = f.submit 

在這第二個步驟,文件不保留:

= simple_form_for [@contact_import] do |f| 
    = f.input :file, as: :file 
    = f.input :some_other_input 
    = f.submit 

回答

3

不要使用Tempfile。爲上傳的數據生成自己的唯一文件名,並將該文件保存在一個特殊的目錄中。 (如果您正在使用Capistrano進行部署,我會在生產環境中將上傳目錄放在shared之下,在config/deploy.rb中,我會添加一個部署掛鉤,如果此目錄尚不存在,則會創建上傳目錄。使用config/environments/production.rbconfig/environments/development.rb一個配置值上傳目錄,所以一切的路徑在這兩個開發和生產的無縫協作。在我的控制器動作,我會做類似File.join(Rails.root, UPLOAD_PATH, filename)建立正確的路徑上傳的文件。)

將生成的文件名保存到數據庫中,並在用戶返回第二步時檢索它。另外,添加一個自定義rake任務,該任務清理從未使用的舊上載,並且在生產中,從cron作業運行該任務。 (我建議使用whenever寶石來配置您的cron作業。)

+0

您的解決方案聽起來不錯,但我不想保存該文件,因爲我的應用程序位於Heroku上,而且我不想將該文件存儲在S3上。 –

+0

Heroku明確指出,他們不會*保證*任何寫入文件系統的文件都將被保留。這不會改變你是否使用'Tempfile'或其他任何東西。除了使用S3之外,唯一可靠的解決方案是將文件內容作爲「BLOB」存儲在數據庫中。 –

+0

這就是我所想的......我想我會像你提到的那樣將它存儲爲一個blob。 –

相關問題