php 上傳檔案

2022-03-21 06:13:02 字數 3626 閱讀 7629

引:

在apache配置檔案中設定php上傳臨時目錄

在伺服器上配置webmail(比如我最喜歡的squirrelmail)時,出於伺服器安全考慮,一般在apache配置檔案中作

php_admin_value open_basedir

的限制,防止php程式瀏覽整個硬碟,這個限制在使用虛擬主機的伺服器上使用的更多。

然而這個安全措施帶來乙個隱含的限制,就是php的上傳臨時目錄(預設為/tmp)無法被php程式訪問,導致webmail中上傳附件時失敗,比如squirrelmail提示「could not move/copy file. file not attached.」(「無法移動/複製檔案。檔案需要被附在郵件上」)。

通過在apache配置檔案中新增乙個設定

php_admin_value upload_tmp_dir

讓php程式在上傳時使用指定的目錄作為臨時檔案目錄。

當然,要注意此目錄的許可權設定要讓apache的執行使用者能寫入。

學習php難免總是會遇到一些莫名其妙的問題,就是搞不懂為什麼,明明自己設定的都是正確的,但就是出問題,這不,今天我又遇到了乙個這樣的問題,浪費了我好幾個小時,才弄明白是**出了問題,真是鬱悶死了。

今天直接找了乙個上傳檔案的php源**進行測試,總是顯示錯誤,提示為錯誤**是2。我就在網上找了找資料。

其中, 

請注意這是乙個標籤,我們要實現檔案的上傳,必須指定為multipart/form-data,否則伺服器將不知道要幹什麼。

值得注意的是檔案upload_file_post.php中表單選項 max_file_size 的隱藏值域,通過設定其value(值)可以限制上載檔案的大小。

max_file_size 的值只是對瀏覽器的乙個建議,實際上它可以被簡單的繞過。因此不要把對瀏覽器的限制寄希望於該值。實際上,php 設定中的上傳檔案最大值,是不會失效的。但是最好還是在表單中加上 max_file_size,因為它可以避免使用者在花時間等待上傳大檔案之後才發現該檔案太大了的麻煩。

<?php

$upload_dir = './upload_files/';

if (!move_uploaded_file($_files['userfile']['tmp_name'],$upload_dir.$_files['userfile']['name']))

echo "檔案上傳失敗,錯誤資訊:".$_files['userfile']['error']."

";else

echo "檔案".$_files['userfile']['name']."上傳成功

";?>

以上範例中 $_files 陣列的內容如下所示。我們假設檔案上傳欄位的名稱為 userfile(名稱可隨意命名) 

如果名為file1.doc和file2.doc檔案被上傳,則$_files['userfile']['name'] [0]將包含檔案file1.doc的名稱,而$_files['userfile']['name'] [1]則將包含檔案file.doc的名稱。

值:0; 沒有錯誤發生,檔案上傳成功。

值:1; 上傳的檔案超過了 php.ini 中 upload_max_filesize 選項限制的值。

值:2; 上傳檔案的大小超過了 html 表單中 max_file_size 選項指定的值。

值:3; 檔案只有部分被上傳。

值:4; 沒有檔案被上傳。

我上傳的一首***,大概4m多,我看錯誤**是2,開來是我的html 表單中 max_file_size 選項指定的值太小了,我看了一下,數值是30000,我又查了一下,這個設定的單位是位元組,看來的確是這個問題了,把值設定大點不就ok了嗎,我一下改為了10m,看來是沒問題了。然後進行測試,可又出現了錯誤**1。哎!怎麼還有問題啊。不過沒關係,一步步來嗎。

不就是錯誤**1嗎,哦,原來是upload_max_filesize限制值太小了,二話不說,改為10m了。哈哈。。。。。。測試,暈,還是不行。我就繼續找php.ini設定的資料。看到下面的東西:

php上傳檔案涉及到的引數php預設的上傳限定是最大2m,想上傳超過此設定的檔案,需要調整php、apache等的一些引數. 下面,我們簡要介紹一下php檔案上傳涉及到的一些引數: 

是否允許通過http上傳檔案的開關,預設為on即是開 

upload_tmp_dir用來說明php上傳的檔案放置的臨時目錄,要想上傳檔案,得保證伺服器沒有關閉臨時檔案和有對資料夾的寫許可權,如果未指定則php使用系統預設值 

允許上傳檔案大小的最大值,預設為2m 

控制在採用post方法進行一次表單提交中php所能夠接收的最大資料量。如果希望使用php檔案上傳功能,則需要將此值改為比upload_max_filesize要大 

以秒為單位對通過post、get以及put方式接收資料時間進行限制。如果應用程式所執行環境處在低速鏈路上,則需要增加此值以適應接收資料所需的更多時間 

為了避免正在執行的指令碼大量使用系統可用記憶體,php允許定義記憶體使用限額。通過memory_limit變數來指定單個指令碼程式可以使用的最大記憶體容量變數memory_limit的值應當適當大於post_max_size的值 

max_execution_time設定了在強制終止指令碼前php等待指令碼執行完畢的時間,此時間以秒計算。當指令碼進入了乙個無限迴圈狀態時此變數非常有用。然而,當存在乙個需要很長時間完成的合法活動時(例如上傳大型檔案),這項功能也會導致操作失敗。在這樣的情況下必須考慮將此變數值增加,以避免php在指令碼正在執行某些重要過程的時候將指令碼關閉 

我就照著上邊的,把限制都改得超大,這回應該沒有問題了吧,都設定好了。測試一下嘍。真鬱悶,還是提示錯誤**1。不對啊,我設定的都很大啊,不會有問題的。怎麼回事呢。

算了,呆會再研究,先讓同學玩吧,去買飯了,不然呆會餐廳沒飯了,呵呵。。肚子餓了!

回來了,繼續研究那個煩人的問題。我上傳個小檔案嗎。上傳個word文件,才兩百多k,哦耶!成功一次。弄個1m多的壓縮包,又成功了,再試試我那歌曲了。哎!還是不成功。看了看那首歌有5m多,上傳個小店的歌曲了。我找了個2m多的歌曲上傳,還是不成功。再試個不到2m的歌吧,居然成功了。看來是不能上傳大於2m的東西了。奇怪啊,不大對啊,我設定的限制是10m 啊,遠遠大於了。難道是我設定沒成功。我又看了看設定,沒有問題的。

。。。。。。。。。。。。

我不停的想啊,累死了,2m........這不就是php.ini設定上傳限制的預設值嗎,我改了怎麼沒有成功呢。哦??可能是伺服器得重啟一下,以前也經常遇到非重啟伺服器才能解決問題的情況。於是我就重啟的apache(我用的是這個),再試試了。成功了!!這次真的是搞定了。

以前在配置php環境的時候,也遇到過類似的情況,感覺配置的環境沒有問題,可就是測試不成功,一般都是需要重啟apache等伺服器了。所以呢,以後,已更改類似php.ini等檔案後,一定要記得重啟伺服器。

例項:php_admin_value open_basedir /www/mail.yourdomaim.com

當然,從來不對php作限制的人是不會遇到這個問題的(只會遇到伺服器被黑)。

php mysql上傳檔案 PHP 檔案上傳

通過 php,可以把檔案上傳到伺服器。建立乙個檔案上傳表單 允許使用者從表單上傳檔案是非常有用的。請看下面這個供上傳檔案的 html 表單 芝麻教程 web3.xin 檔名 將以上 儲存到 form.html 檔案中。有關上面的 html 表單的一些注意項列舉如下 標籤的 enctype 屬性規定了...

php 檔案上傳

在php中,檔案上傳一般是通過move uploaded file 來實現的。bool move uploaded file string filename,string destination 本函式檢查並確保由 filename 指定的檔案是合法的上傳檔案 即通過 php 的 http post...

PHP檔案上傳

最近在寫關於php上傳影象檔案,寫了一整星期,還是不怎麼清楚其中原理,在此也只能把一些表象小結小結。php上傳檔案,是通過表單上傳的 注意得把form標籤的enctype屬性賦值multipart form date 先從客戶端把檔案上傳到伺服器 這怎麼傳上去的不清楚 再在伺服器上覆制到其他位址,開...