preloader
學習

Drupal上傳大檔案的解決方法

前些日子經由Drupal web application上傳大檔案,第一次忘記放鬆php的上傳檔案限制,導致上傳約1.5G的壓縮檔,經過File Field module和Storage API module方式上傳,呈現的檔案被裁減,這變成不完整的檔案,找了好幾個網頁,發現很多人也有類似我的狀況(上傳1~2G或是超過2G以上)。

研究了幾個說法:

  1. 一些瀏覽器最大只支援約2G檔案的http上傳(參考資料 http://www.motobit.com/help/scptutl/pa98.htm ),若要更大和更穩的上傳檔案,建議使用FTP。若不得已必須使用http,則建議使用multi-part form去上傳檔案。

  2. Drupal 及其使用module的限制,會連動於apache(或其他httpd process)和php上傳檔案的限制,或更為嚴格的檔案大小限制。

  3. apache(或其他httpd類process)設定檔和php.ini的限制。

 

解決步驟是

  1. 確認自己在/etc/php.ini檔案內,已經調整變數post_max_size, upload_max_filesize, memory_limit, max_file_uploads, max_input_time, max_execution_time, default_socket_timeout,設定完畢請重開apache或其他你使用的httpd process。請注意前三個變數值post_max_size, upload_max_filesizememory_limit之間的關係,memory_limit > post_max_size > upload_max_filesize(參考資料 舊館國小資訊部落 http://aachi0707.blogspot.tw/2010/10/phpini.html , 于老師日誌http://yunol.com.tw/phpbb3/viewtopic.php?f=15&t=23064 );max_file_uploads是單次可上傳的檔案數量,一些著名網站即透過本項變數限制使用者的單次上傳數量;max_input_time是php使用put, get, post方式傳送資料的最大運作時間,max_execution_time是php執行的最大運作時間(參考資料 http://blog.csdn.net/jbxu88/article/details/6035206 ),一些著名網站會限制使用者上傳檔案的時間,例如一小時,是用max_input_time變數進行; default_socket_timeout則是限制以socket方式收送資料的最大限制時間。httpd.conf則建議設定LimitRequestBody變數的值為0,0代表是無限制。

  2. 請確認機器(本例是ec2)上/tmp目錄使用的硬碟暫存空間足夠,能夠讓大檔案上傳,建議保留兩倍的大檔案上傳空間。/tmp目錄是查php 環境執行函式phpinfo(),或是在命令列輸入 php -i指令,查看uploadprogress module中的uploadprogress.file.contents_templateuploadprogress.file.filename_template才得知的。File Field module會將上傳的檔案暫存在機器上,再經由Storage API module上傳到雲端空間(本例是s3),這個過程會產生storage-{亂碼}, php{亂碼}, upt_{亂碼}…等等的檔案,過程結束後Drupal會自動刪掉這些,請不用擔心,如果過程結束後仍有這些檔案,請自行刪掉,File Field module和Storage API才會正常運作。請不要刪到update-{亂碼}的目錄。

3.以管理員權限登入Drupal web application,進入{架構/內容類型(structure/types)},點選你建立的內容類別,例如是 文章、討論區 ,或是內容形態,例如影片Video、其他檔案Others,編輯裡面的上傳檔案相關欄位,確認其中的最大上傳大小欄位之說明值是相同於在php.ini設定的數值。建議在最大上傳大小欄位不填入任何值,這樣就能使用php.ini定義的最大上傳檔案大小值。

 

提醒:

尋找解決方案的過程中,我曾猜測是不是AWS_S3或是AWS_Cloudfront有限制上傳檔案。經查閱相關資料發現,目前為止(本文撰寫時間20150626)S3可存放的一個檔案大小範圍是1 Byte到5TB, 可經由瀏覽器上傳的一個檔案大小是5GB(參考資料 https://aws.amazon.com/tw/blogs/aws/amazon-s3-object-size-limit/ 且前提是瀏覽器也能支援上傳5GB的檔案),Cloudfront最大可傳遞的一個檔案大小是20GB(參考資料https://aws.amazon.com/tw/blogs/aws/amazon-cloudfront-support-for-20-gb-objects/ )。以我使用的檔案大小範圍,這些限制是沒有影響到。