2012-11-26 209 views
14

這個問題似乎直接關係到臭名昭着的2GB限制,我不確定在這個atge如果它的32位PHP的問題。 我見過與HTTP相關的評論不是爲這樣的大文件設計的。但是,在決定對迄今爲止已被證明有效的任何根本性改變之前,我寧願耗盡這個方向。 由於標題建議我需要上傳> 2GB的文件,目前最大的3.8GB。 我有一個使用jQuery文件上傳構建的表單,它在發送任何文件(全部少於< 2GB)之前一直沒有問題,直到這些大文件啓動。 3.8GB的文件上傳可能需要5分鐘的時間,並且進度條完成到100%。 但是,上傳後報告的錯誤是類型1,表明文件大小限制已被違反。4GB HTTP文件上傳使用jQuery文件上傳,Apache和PHP

如果我在上傳過程中監視服務器上的磁盤使用情況,它將具有以下示例屬性: 在上載磁盤之前,使用率爲30%,隨着上傳的繼續,此使用率增加31%,32%.... 45%,46%等。 然而,在2GB點附近,當客戶端/瀏覽器文件上傳繼續時,磁盤使用率回落到30%。 當服務器磁盤使用停止增加時,客戶端可能只有上傳的60%。 然而,客戶端仍然持續100%,但未被服務器接受,因爲磁盤狀態永遠不會退出30%。

我正在運行64Bit Ubuntu(最新版本)與Apache/2.2.22(Ubuntu)和PHP版本5.3.10-1ubuntu3.2 經過多天尋找解決方案,我仍然無法獲得3.8GB文件在更改很多設置後上傳。 我會列出下面的變化,但在這個階段,我認爲它可能是一個32位PHP的問題,所以如果任何人都可以建議值得跟隨或值得嘗試的解決方案的鏈接,我會很感激。

在Apache2的我已經設置如下:

- apache2.conf I've set Timeout to 900 
- httpd.conf I've set LimitRequestBody to 0 
- .htaccess in the file upload directory I've set: 
    - LimitRequestBody to 4939212390 
    - php_value upload_max_filesize 4831838208 
    - php_value post_max_size 4939212390 

在php.ini中我已經設置如下:

- UPLOAD_MAX_FILESIZE 4831838208 
- POST_MAX_SIZE 4939212390 
- max_execution_time 120 
- max_input_time 60 
- memory_limit 128M 

如果我運行在服務器上的以下這似乎在PHP沒有32位的問題,但我不確定在這個階段。

php -r "echo PHP_INT_MAX;" 
9223372036854775807 

正如我所提到的任何想法將不勝感激。

UPDATE:

已經解決了這個問題,所以感謝@BogdanBurim提出了這個迴歸基本的方法:

我已成功上傳3.8 GB的文件通過HTTP使用以下設置:

在Apache2的我已經設置如下:

- apache2.conf I've set Timeout to 900 
- httpd.conf I've set LimitRequestBody to 0 
- .htaccess in the file upload directory I've set: 
    - LimitRequestBody to 0 
    - php_value upload_max_filesize 0 
    - php_value post_max_size 4939212390 
- .htaccess in the php temp directory (in my case its /tmp/) I've set: 
    - LimitRequestBody to 0 
    - php_value upload_max_filesize 0 
    - php_value post_max_size 4939212390 

在PHP。INI我設置如下:

- UPLOAD_MAX_FILESIZE 0 
- POST_MAX_SIZE 4939212390 
- max_execution_time 120 
- max_input_time 60 
- memory_limit 128M 

這種解決方案的唯一的其他重要組成部分,是不必從上傳表單中刪除MAX_FILE_SIZE,HTML:

<input type="hidden" name="MAX_FILE_SIZE" value="4939212390" /> 

有了這套不斷引起了PHP輸入2錯誤,所以php無法處理大於32位的整數。 刪除它導致了PHP類型1錯誤,直到我將UPLOAD_MAX_FILESIZE更改爲0,並且它現在可以正常工作!

http://php.net/manual/en/features.file-upload.errors.php

+0

相關:http://stackoverflow.com/questions/50 53290/large-file-upload-though-html-form-than-2-gb – valentinas

+0

嘗試使用簡單的HTML表單和上傳文件。它會崩潰嗎?你可能會看到確切的錯誤信息。 –

+0

謝謝@BogdanBurim我會稍後再嘗試並更新 – Diplonics

回答

6

已經解決了這個問題,所以感謝@BogdanBurim提出了這個迴歸基本的方法:

我已成功上傳3.8 GB的文件通過HTTP使用以下設置:

在我的Apache2」 VE設置如下:

- apache2.conf I've set Timeout to 900 
- httpd.conf I've set LimitRequestBody to 0 
- .htaccess in the file upload directory I've set: 
    - LimitRequestBody to 0 
    - php_value upload_max_filesize 0 
    - php_value post_max_size 4939212390 
- .htaccess in the php temp directory (in my case its /tmp/) I've set: 
    - LimitRequestBody to 0 
    - php_value upload_max_filesize 0 
    - php_value post_max_size 4939212390 

在php.ini中我已經設置如下:

- UPLOAD_MAX_FILESIZE 0 
- POST_MAX_SIZE 4939212390 
- max_execution_time 120 
- max_input_time 60 
- memory_limit 128M 

該解決方案的唯一的其他重要組成部分,是不必從上傳表單中刪除MAX_FILE_SIZE,HTML:

<input type="hidden" name="MAX_FILE_SIZE" value="4939212390" /> 

有了這套不斷引起了PHP 2型錯誤,所以PHP玩不轉比更大設置的32位整數。 刪除它導致了PHP類型1錯誤,直到我將UPLOAD_MAX_FILESIZE更改爲0,並且它現在可以正常工作!

http://php.net/manual/en/features.file-upload.errors.php

+0

您是否在所有瀏覽器版本(IE 7+和FF12 +)中都測試過,並且在所有這些瀏覽器中都能正常運行?使用簡單的'HTML''

+0

@VikasV我沒有在任何IE平臺上測試過,但現在會問你。它在FF和CH上工作正常,但問題不是我的客戶端瀏覽器。在FF和CH中,如果發送了文件,但始終在服務器端報告2GB +文件的部分文件上傳問題,這已根據上述設置爲我解決。 – Diplonics

+0

LimitRequestBody在[Apache 2.4](https://httpd.apache.org/docs/2.4/mod/core.html#limitrequestbody)中默認爲'0'(無限制),也可能是其他版本。 – chb

-7

的問題是,爲什麼你會使用瀏覽器來上傳> 1GB。考慮頂級文件共享服務,通過瀏覽器將文件上傳大小限制在1GB以內。如果用戶下載失敗,會發生什麼,您將不得不重新啓動整個過程。

如果你有如此大的文件上傳,山洪,ftp或像rapidshare,fileupload,megaupload等個人上傳客戶端,你有沒有找過替代方法。

由於設置爲POST的文件大小限制,您受到限制。如果您決定使用HTTP上傳更大的文件,我會勸阻的,最佳解決方案是分割文件並上傳較小的分裂部分,然後重新組合文件。

+0

也許他正在構建下一個共享服務...... – mgarciaisaia

+2

「如果用戶下載失敗,您將不得不重新開始整個過程​​。」呃,不是嗎? http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.16 – valentinas

+0

是的,這是很好的結局在腐敗的文件。以這種方式上傳這樣的大文件是愚蠢的。 –

0

如果你有機會到Apache虛擬主機的配置也可以更改這些設置特定的上傳URL(你也可以添加到您的.htaccess文件):

有了這個代碼:

<LocationMatch "/index.php/url-of-your-upload.php"> 
    php_value max_execution_time 0 
    php_value upload_max_filesize 0 
    php_value post_max_size 4939212390 
    php_value memory_limit 4G 
    LimitRequestBody 0 
</LocationMatch> 

的LocationMatch指令允許你選擇URL(您可以使用REG EXP)

+0

將它放在我的.htaccess文件上時,給了我一個500錯誤。 –