2012-09-30 58 views
1

在發揮框架刷新頁面,是否有可能拒絕場拒絕形式沒有發揮2.0.3

filledForm.reject("myField", "You are missing files"); 
return badRequest(myform.render(filledForm)); 

無需重新加載頁面?

我有一個文件輸入欄,讓用戶選擇文件。在拒絕和重新加載時,文件被清除並顯示錯誤。我想,他們所選擇的文件在那裏

當前的行爲: 之前提交形式:

Before

提交後(錯誤:文件都沒有了)

Before

回答

3

文件選擇輸入字段(即<input type="file" ... />)與其他輸入字段不同 - 無法從服務器端預先填充值。如果可以的話,這將是一個巨大的安全漏洞(想想<input type="file" value="/etc/passwd" .. />)。在服務器上,當您獲取提交的表單時,您沒有獲取上傳文件的完整路徑,只是文件的名稱和內容。

如果您確實需要保留文件輸入字段的值,則需要採用不同的路徑:通過Ajax提交表單(谷歌爲「ajax文件上傳」獲取某些技術和庫以幫助完成此操作) ,並使用Ajax響應來指示文件是否有效。


進一步澄清:與正常的HTML/HTTP POST方法(其中播放形成傭工使用),原來的頁面消失,服務器的響應是沒有連接到前一頁新的一頁。 Play表單助手將使用先前的值預填充此頁面上的輸入字段,但是如上所述,這對於文件輸入字段是不可能的。

這就是爲什麼有特殊目的的Javascript庫上傳文件。如果你的表單主要關心文件上傳,你應該看看這些。 (例如http://fineuploader.com)。在服務器端,Ajax查詢的目標將是一個新的Action,它只處理上傳的文件並返回成功/失敗消息,然後將顯示給用戶。

+0

我明白。我的問題是如果有可能不必重新加載頁面就拒絕表單,這樣文件名就不會消失。 我可以說明使用javascript的簡單驗證,即檢查字段是否爲空 - 如果它們在提交之前拋出錯誤。但是,我有驗證文件格式的驗證,所以JS不會工作 – by0

+0

對不起,你不可能做你想要的常規表單。我爲我的答案增加了一些解釋。 Javascript/Ajax方法將提交表單而不重新加載頁面。 –

+0

謝謝。我會看看它! – by0

3

如果服務器能夠操縱文件字段的值,這將是一個主要的安全風險,因爲我們可以從用戶硬盤驅動器獲取任何文件。如果我們看一下你有兩個要求,

  • 獲取文件內容的服務器
  • ,請勿打擾客戶端UI狀態

唯一的選擇是使用AJAX文件上傳。所以,你的流量現在變成:

  • 通過AJAX提交的文件上傳
  • 驗證內容
  • 保存文件供以後檢索
  • 發回的狀態(OK或錯誤)
  • 顯示錯誤提示錯誤
  • 提交完整表格後,查看以前保存的文件

如果您不介意加載,您可能會作弊一點 - 只需使用AJAX進行驗證即可顯示錯誤消息並讓文件在正常提交中再次上傳。

它是所有關於我們有限制的工作。