2015-10-15 92 views
9

我在Laravel 5.1中使用表單發佈一些文本並上傳文件。它看起來像這樣(簡體版):需要Laravel 5.1:將上傳的文件保存爲舊輸入

{!! Form::open(array('url' => 'foo/bar')) !!} 
    {!! Form::text('image_name') !!} 
    {!! Form::file('image') !!} 
    {!! Form::submit('Submit!') !!} 
{!! Form::close() !!} 

文本字段,所以我在我的控制器中添加一個$validator。如果驗證失敗,用戶將被重定向回表單。我用的是withInput()方法來重新填充表單,使用戶不必在再填寫:

if ($validator->fails()) { 
    return redirect()->back()->withInput(); 
} 

這將讓舊的輸入迴文本框,下拉菜單等,但如果用戶已經上傳了文件,當驗證失敗並且必須再次選擇時,文件選擇消失。 Laravel有沒有辦法將文件選擇記憶爲舊輸入?

謝謝!

+1

爲了安全性/複雜性的原因,我認爲你不能 - 不只是在Laravel中,而是在一般情況下。 –

回答

17

不,file輸入不能由Laravel或任何軟件預填充。您的網站(和任何網站)不會也不應該知道文件的本地路徑。想象一下安全風險!你可以欺騙用戶上傳他們的SSH私鑰或其他東西。

你需要做的是處理上傳的文件,不管是否存在驗證錯誤。

然後,您可以將其存儲在您的數據庫中,使用pending狀態,或者爲其指定一個唯一的hash,並在用戶會話中存儲匹配的hash。重點是能夠識別屬於這個特定用戶的不完整上傳。

然後,當您顯示錶單時,從會話或數據庫中檢索這些不完整的文件,並在文件上傳旁邊顯示縮略圖。這告訴用戶他們不需要重新上傳該文件。只要確保他們有辦法將其刪除以防萬一他們改變了主意。

表單提交正確後,清除會話hash或更新數據庫狀態爲complete;無論你需要做什麼。

+0

謝謝你這個明確的答案;這很有道理。無論如何,我會研究處理上傳文件所需的邏輯。 – elton73

2

對於同一個問題,似乎存在很多問題(Form::file: How to repopulate with Input::old After Validation Errors and/or on Update?),每個有明顯知識的人都說這是不可能的。

我會proppose一個解決方法覆蓋以下目標:

  • 保持表單數據,並在失敗Laravel驗證只
  • 使用服務器端驗證的情況下,文件輸入。您 不需要 切勿使用JavaScript驗證。

它的關鍵字全部是AJAX。我會做到以下幾點:

2017年12月更新:發送所有領域和附加文件由單AJAX POST

  1. 創建一個Ajax形式(方法 GET POST),它包含一切 除了 包括文件輸入。請記住,它需要發送Laravel CSRF令牌
  2. 在你需要讓你的反應(失敗或成功)做一個JSON輸出控制器的驗證,所以你的AJAX發送代碼可以得到在任何情況下的反應,然後你就可以在瀏覽器中顯示它

這樣你可以避免在服務器上有任何臨時狀態的文件。

這個過程中,如果你擔心使用的帶寬,你希望在你輸入的字段有錯誤將是非常常見的,你可以做兩個(或更多)AJAX POST驗證的更復雜,但改良版:在第一個僅包含輸入字段,如果沒有問題,則發送所有字段(再次輸入字段,現在包括附加文件)以再次嘗試驗證,並在所有數據成功時執行操作。