2013-04-22 78 views
0

我有一個簡單的PHP表單,通過電子郵件發送一些文本數據和一個文件附件。只要上傳不會破壞服務器上的任何限制,例如大小或執行時間,我相信一切正常。當文件打破這些限制時,瀏覽器顯示上傳0% - 100%就好了,但不提交表單,頁面只刷新,不發送POST數據。以PHP格式上傳大文件中斷提交

我沒有選擇增加任何限制。我正在開發一個項目,我無法通過php.ini,.htaccess或ini_set()來增加上傳大小或執行時間的限制。這很好,我確信這個特定客戶的託管公司給我的限制。

但是,當用戶試圖上傳超過限制的大文件時,我只需要一種用戶友好的方式來提交表單,而不是完全停止執行,並且頁面刷新時沒有POST數據。此時,我甚至不能在提交時向用戶顯示任何錯誤,例如「文件必須低於10MB」,因爲當文件太大時,表單實際上從未實際發佈。

如果需要澄清,請讓我知道。

+0

它應該拋出一個你可以捕獲的'UPLOAD_ERR_INI_SIZE'錯誤。 – elclanrs 2013-04-22 20:24:39

+0

我認爲這是導致問題的大小,但我看到我的日誌中沒有錯誤。除了大小還有什麼可能導致它?記憶?執行時間處理時間?希望我至少會看到一些錯誤,但我沒有。 – jackrugile 2013-04-22 20:41:31

+0

可能是一個權限問題?你有權上傳到你上傳的目錄嗎? – doliver 2013-04-22 20:53:48

回答

1

顯然,如果您的腳本用於將您的文件作爲電子郵件附件發送,確實您的文件應該低於10Mo,因爲大量郵件服務器會拒絕更大的電子郵件。

出於安全原因,您無法從瀏覽器訪問有關文件的信息。但只要在表單的文件字段中選擇了該文件,就可以使用HTML5文件API。 See this page for a complete presentation

這裏是代碼的一部分,你會在提交前需要處理的文件大小:

<input type="file" id="a_file" name="a_file" /> 
<script> 
    function fileSelect(evt) { 
    var file = evt.target.files[0]; 
    var size_mo = (file.size/(1024 * 1024)).toFixed(3); 

    if (size_mo >= 10) 
    { 
     alert('Your file is too big ('+size_mo+'Mo).'); 
     // eventually reset the form with window.your_form.reset() to avoid submit 
    } 
    else 
    { 
     alert('Your file is ready for upload ('+size_mo+'Mo)'); 
    } 
    } 
document.getElementById('a_file').addEventListener('change', fileSelect, false); 
</script> 

但是這種解決方案只能支持到最新的瀏覽器,而不是與Internet Explorer的版本低於兼容10.

沒有其他解決方案使用HTML或JS。如果您需要完全支持,您需要使用Flash或Java(請注意,還有未安裝這些技術的計算機)。 因此,您可以做的最好的做法是使用帶瀏覽器檢測的HTML5代碼,並且如果您無法讀取文件大小並且在支持HTML5的情況下具有良好行爲,請不要警告用戶。

+0

這個解決方案看起來不錯,這個客戶端有很多ie7-ie9的流量,但不支持HTML5 File API。這些瀏覽器的其他解決方案?參考:http://caniuse.com/fileapi – jackrugile 2013-04-22 21:31:17

+0

@jackrugile有沒有辦法做到這一點使用HTML或JS與IE9或更低的支持。 如果您使用Java Applet請求讀取文件系統或使用Flash應用程序的權限,則可以執行此操作。 – ffarquet 2013-04-23 08:26:37

+0

@jackrugile我更新了我的答案。所以現在完成了。 – ffarquet 2013-04-23 08:32:32