2013-03-13 89 views
1

以下兩個問題闡明瞭由於安全原因無法更改input file的值。更改輸入文件的值

在PHP中,驗證一個形式中,通常的方法之一時是重新填補被點擊submit按鈕之前提供在input text輸入的數值,所以客戶知道他插入了什麼,或者只是將值保存在字段中,這是客戶期望的。 (每次出現特定錯誤時,他都不必重新填寫表格)。

所以我們使用以下命令:

<input type="text" name="title" id="title" maxlength="100" value="<?php echo htmlspecialchars($title);?>" /> 

因此,既然我不能改變input file的價值,所以與所提供的路徑$image['tmp_name']我可以重新填充它,這意味着客戶將不得不重新上傳(或重新瀏覽)圖像,每次驗證出錯時,是否有任何可能的方法來保持該值?

+0

嗯,首先,驗證之前提交(但不可靠,所以不信任它),然後在「禁運」下載您* *收到並保留對該文件的引用,告訴用戶您將在重新提交時維護該文件。然後,每隔一段時間,刪除從未移動到適當位置的文件。 – 2013-03-13 00:48:09

+0

你可以使用JavaScript驗證,防止表單發佈,直到它有效。 – bleuscyther 2013-03-13 00:48:11

+0

或... base64對文件源進行編碼,將其發送回表單中的「隱藏」字段,並在返回時將其解碼。顯然,對於非常大的文件來說不是一個好主意,所以需要進行一些理智檢查。 – 2013-03-13 00:50:04

回答

0

無論表單中存在其他驗證錯誤(顯然只有在文件本身有效時),然後用文件詳細信息(例如列出文件名和大小)來替換文件上傳字段,您纔可以存儲該文件。

實際上,如果他們願意,而不是替換字段,我建議給他們上傳不同文件的選項。

+0

如果其他輸入無效,我不想存儲文件(如果他沒有註冊 - 如果其他輸入無效,我不想插入新用戶的配置文件圖片)。 – 2013-03-13 00:48:57

+0

您可以將文件存儲在臨時位置,直到註冊完成,然後將其移至常用位置,並設置一個任務以定期從該臨時目錄中刪除文件。但要做到你所要求的 - 只是把路徑放回現場 - 是不可能的。 – 2013-03-13 00:55:07

0

將上傳的文件存儲在服務器上。

使用引用與該文件關聯的ID的值生成複選框。使其默認被選中。

如果用戶不想重複使用同一個文件,請取消選中它。

+0

存儲文件並不是一件非常緊迫的事情,如果其他輸入未經過驗證,我不想存儲它,這只是將路徑保留在輸入文件中的問題。但看起來像「輸入文件」就像captcha,它會在回傳後重新生成(變爲空)。 – 2013-03-13 00:54:31

+0

您無法在文件輸入中保留路徑,這就是您將文件存儲在服務器上的原因。這樣,不僅保留了價值(以四捨五入的方式),而且文件不需要重複上傳。 – Quentin 2013-03-13 07:31:07

0

使用JavaScript,您可以防止表單被提交,直到所有字段被驗證。

我建議使用jQuery Validation Engine教程。 demos

您還可以使用jQuery file upload爲圖片上傳器添加一些樣式。

當然,一些領域必須在服務器上進行驗證,這就是爲什麼您可以發佈帶驗證引擎的ajax請求。

"ajaxUserCall": { 
    "url": "ajaxValidateFieldUser", 
    "extraData": "name=eric", 
    "alertText": "* This user is already taken", 
    "alertTextOk": " * User is valid", 
    "alertTextLoad": "* Validating, please wait" 
}, 

與服務器端驗證不用其他的一些例如重定向或刷新:Demo

+0

問題不在於驗證,問題是當我在服務器上進行驗證時(檢查數據庫是否已使用電子郵件 - 檢查用戶名是否可用),並返回錯誤消息(此用戶名不可用) ,「輸入文件」中的路徑消失了,我無法保留它的值。 – 2013-03-13 01:06:43

+0

當頁面刷新? – bleuscyther 2013-03-13 01:10:56

+0

是的,當頁面刷新。 – 2013-03-13 01:11:53