2012-09-21 30 views
19

我正在使用Valums file uploader通過帶有進度條的網頁上傳文件。幾乎一切工作正常,但我無法更改默認tmp目錄,其中文件存儲在上載。設置PHP tmp目錄 - PHP上傳不起作用

文件應存放在/upload目錄而不是默認的系統/tmp目錄,因爲/tmp被安裝在有其大小限制爲4   MB和用戶會上傳約10   MB的文件RAM磁盤。

我已經搜索了大量的網頁,但沒有解決方案的工作。在php.ini 我設置臨時目錄:

upload_tmp_dir =/upload 

我設置權限/upload目錄,和Apache是​​該文件的所有者,所以該目錄是絕對不可寫PHP。

我已經將文件上傳器中的目標路徑設置爲/upload,因爲我希望文件在上傳後也存儲在此目錄中。最終的結果是小文件正在成功上傳,但大於4   MB的文件無法上傳 - 我想到的唯一原因是在上載過程中文件存儲在/tmp中。可以肯定的是,我用sys_get_temp_dir()進行了檢查,結果爲/tmp -so PHP忽略了我的php.ini指令,或者有其他一些方法來設置上傳過程中存儲文件的位置。

呵呵,最後一條信息:open_basedir沒有設置,所以PHP對磁盤的訪問只受文件權限限制。

+2

你重新啓動服務器(抱歉這個愚蠢的問題)? – soju

+0

有沒有愚蠢的問題,只是愚蠢的答案:)。是的,我在嘗試解決問題並嘗試不同的解決方案時做了很多次。 – Wookie88

+0

你是否檢查過,PHP沒有安裝爲CGI MOD? (來自doc:*如果此處指定的目錄不可寫,則PHP返回到系統默認臨時目錄*) – soju

回答

50

這裏描述的問題很久以前就解決了,但我不記得上傳的主要原因是什麼不起作用。有很多事情需要修復,以便上傳可以工作。我已經創建了可以幫助其他人出現類似問題的清單,我會對其進行編輯以儘可能地提供幫助。正如我以前在聊天時所說的那樣,我正在研究嵌入式系統,因此在非嵌入式系統上可能會跳過某些點。

  • 在php.ini中檢查upload_tmp_dir。這是PHP在上傳時存儲臨時文件的目錄。

  • 在php.ini中檢查open_basedir。如果定義,它將PHP讀/寫權限限制在指定路徑及其子目錄下。確保upload_tmp_dir位於此路徑內。

  • 在php.ini中檢查post_max_size。如果你想上傳20 MB的文件,試試更大一點的東西,比如post_max_size = 21M。這定義了您在上傳過程中可能使用的POST消息的最大大小。

  • 在php.ini中檢查upload_max_filesize。這指定了可以上傳的最大文件。

  • 在php.ini中檢查memory_limit。這是腳本可能消耗的最大內存量。很明顯,它不能低於上傳大小(老實說我不太清楚它 - PHP可能在複製臨時文件時緩衝)。

  • 確保您正在檢查PHP Web服務器上正確使用的php.ini文件。最好的解決方案是與本文所描述的指令執行腳本http://php.net/manual/en/function.php-ini-loaded-file.phpphp_ini_loaded_file功能)

  • 檢查爲哪些用戶運行PHP(見這裏如何做到這一點:How to check what user php is running as?)。我曾在不同的發行版和服務器上工作。有時它是apache,但有時它可能是root。無論如何,請檢查此用戶是否有權讀取和寫入要上傳到的臨時目錄和目錄。檢查路徑的情況下,所有的目錄你上傳到子目錄(例如/dir1/dir2/ -check都dir1dir2

  • 在嵌入式平臺上,你有時需要限制寫入根文件系統,因爲它是存儲閃存卡上這有助於延長此卡的使用壽命如果您正在使用腳本來啓用/禁用文件寫入,請確保在上傳前啓用寫入功能

  • 我遇到了嚴重的問題,這裏http://phpmaster.com/tracking-upload-progress-with-php-and-javascript/)在一些平臺上,首先嚐試一些簡單的方法(如:http://www.dzone.com/snippets/very-simple-php-file-upload),如果有效,你可以嘗試更復雜的機器anisms。

  • 如果您在php.ini中進行任何更改,請記住重新啓動服務器,以便重新加載配置。

+0

好的清單 - 謝謝! – Olaf

+0

'memory_limit'不是上傳的問題。請參閱http://stackoverflow.com/a/5828654/956397 – PiTheNumber

+0

如果您不打算使用PHP讀取整個文件,那麼您是對的。不過,將這一點保留在清單中以保持其更普遍是很好的做法。 – Wookie88

1

我這個問題掙扎了很長一段時間......我 的解決辦法是修改php.ini文件,包含PHP腳本的文件夾中。這很重要,因爲修改根目錄下的php.ini並不能解決問題(我在每個文件夾中都有一個用於細化控制的php.ini)。 在我的php.ini的相關條目這個樣子......(不太可能需要的output_buffering此問題)

output_buffering = On 
upload_max_filesize = 20M 
post_max_size = 21M