⑴ php無法上傳文件該怎麼辦
先試下這段代碼,是最標準的demo
<?php
if((($_FILES["file"]["type"]=="image/gif")
||($_FILES["file"]["type"]=="image/jpeg")
||($_FILES["file"]["type"]=="image/pjpeg"))
&&($_FILES["file"]["size"]<20000))
{
if($_FILES["file"]["error"]>0)
{
echo"ReturnCode:".$_FILES["file"]["error"]."<br/>";
}
else
{
echo"Upload:".$_FILES["file"]["name"]."<br/>";
echo"Type:".$_FILES["file"]["type"]."<br/>";
echo"Size:".($_FILES["file"]["size"]/1024)."Kb<br/>";
echo"Tempfile:".$_FILES["file"]["tmp_name"]."<br/>";
if(file_exists("upload/".$_FILES["file"]["name"]))
{
echo$_FILES["file"]["name"]."alreadyexists.";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/".$_FILES["file"]["name"]);
echo"Storedin:"."upload/".$_FILES["file"]["name"];
}
}
}
else
{
echo"Invalidfile";
}
?>
上面的腳本檢測了是否已存在此文件,如果不存在,則把文件拷貝到指定的文件夾。
注釋:這個例子把文件保存到了名為"upload"的新文件夾。
⑵ PHP上傳文件不成功
if (is_uploaded_file($_FILES['upfile']['tmp_name'])){
$upfile=$_FILES["upfile"];
$name=$upfile["name"];
$type=$upfile["type"];
$size=$upfile["size"];
//tem_name錯誤,應該改為tmp_name
//修改為 $tmp_name=$upfile["tmp_name"];
$tmp_name=$upfile["tem_name"];
//參數2錯誤。中間應該用.號連接,而不是逗號。
//修改為 move_uploaded_file($tmp_name , 'up2/'.$name);
move_uploaded_file($tmp_name,'up2/',$name);
}
⑶ php無法上傳文件到linux主機,高分加急,在線等待!
應該是許可權問題,你進入你的WEB目錄,找到你要存儲上傳文件的目錄,假如為/var/www/upload,執行chown -R www-data:www-data /var/www/upload,如果你沒有更改過apache默認用戶的話,如果更改過,則用更改過的用戶和組(www-data:www-data)。個人建議不要更改許可權為777,非常不安全!有問題在M我!
⑷ php文件上傳失敗的問題
在用PHP進行文件上傳的操作中,需要知道怎麼控制上傳文件大小的設置,而文件可傳大小是受到多種因素制約的,現總結如下:
1、php.ini:upload_max_filesize 所上傳的文件的最大大小。默認值2M。
2、php.ini:memory_limit 本指令設定了一個腳本所能夠申請到的最大內存位元組數,默認值8M。如果不需要任何內存上的限制,必須將其設為 -1。如果內存不夠,則可能出現錯誤:Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes)
3、php.ini:post_max_size 設定POST數據所允許的最大大小。此設定也影響到文件上傳。要上傳大文件,該值必須大於 upload_max_filesize。
4、php.ini:max_execution_time = 30 ; Maximum execution time of each script, in seconds
5、php.ini:max_input_time = 60 ; Maximum amount of time each script may spend parsing request data
6、如果用到mysql的BLOB進行二進制文件存儲,則需要設置my.ini:max_allowed_packet=xxM
7、httpd.conf
在 Apache 裡面有一個選項是 LimitRequestBody,這個選項可以限制用戶送出的 HTTP 請求內容。這個選項可以在 .htaccess 或 httpd.conf 里使用,而如果在 httpd.conf 內使用,分別可以用在 virtualhost 或目錄屬性設定。而 LimitRequestBody 的設定值是介乎 0 (無限制) 至 2147483647 (2GB)。
例如要在目錄 D:/AppServ/www 設定上傳限制為 100K,可以在 .htaccess 或 httpd.conf 加入以下語句:
LimitRequestBody 1024000000
Options Indexes FollowSymLinks MultiViews ExecCGI
AllowOverride All
Order allow,deny
Allow from all
LimitRequestBody 1024000000Options Indexes FollowSymLinks MultiViews ExecCGIAllowOverride AllOrder allow,denyAllow from all
如果透過 .htaccess 設定,儲存檔案後會立即生效;如透過 httpd.conf 設定,須要重新啟動 Apache。
PHP關於文件上傳部分,特別提到表單隱藏域:MAX_FILE_SIZE,意思是接收文件的最大尺寸。文檔中給出的例子如下:
<form enctype=」multipart/form-data」 action=」_URL_」 method=」POST」>
<input type=」hidden」 name=」MAX_FILE_SIZE」 value=」30000″>
Send this file: <input name=」userfile」 type=」file」>
<input type=」submit」 value=」Send File」>
form>
Send this file:
這里設置MAX_FILE_SIZE = 30000,期待一種可能,使得瀏覽器在傳送文件之前能夠依此作出預先判斷,如果文件尺寸大於30000位元組,則不執行實際的POST動作。也就是不往伺服器發送文件內容,而是直接在客戶端提醒用戶「你試圖上傳的文件超過30000位元組」。
這的確是一個非常棒的主張,但在現實中卻暫時無法實現。不是因為這個限制可以「被簡單地繞過」,而是IE和FireFox這兩個主流瀏覽器都不支持這個特性。PHP的這個建議尚未被採納。
MAX_FILE_SIZE還有一個用場:後台PHP會判斷接收到的文件大小是否大於這個值,如果超出,$_FILES[『thisfile』][『error』]會被設置為UPLOAD_ERR_FORM_SIZE(2),同時放棄保存臨時文件,將$_FILES[『thisfile』][『size』]置0。
這個例子,沒問題,表現正常,當我試圖上傳一個40多K的文件時,PHP程序報告「文件超過MAX_FILE_SIZE」。
但是,如果我們將表單中的MAX_FILE_SIZE從30000減少到1000,情形又如何呢?
上傳800位元組的文件,正常;
上傳40K的文件,PHP報告文件過大,也正常;
上傳3000個位元組的文件,PHP未報告錯誤,它成功保存了文件!出乎意料!
問題就出在main/rfc1867.c中判斷文件是否超長的這部分代碼上。php每次從buffer中讀取FILLUNIT位元組長度的內容後,首先判斷「已經讀到的內容長度(total_bytes)」是否大於MAX_FILE_SIZE,然後再增加「已經讀到的內容長度(total_bytes)」。這樣一來,和預計的結果之間至多會有FILLUNIT位元組的誤差,而FILLUNIT=1024*5=5K。(點擊bug了解詳細內容)
這就是說,當MAX_FILE_SIZE<5K時,上傳一個大於MAX_FILE_SIZE,但是小於5K的文件是沒有問題的。
當然,因為這個設置很容易被繞過,所以伺服器端編程不應當依賴於MAX_FILE_SIZE。而且,5K到底是個很小的數值,對大多數上傳文件的表單來說沒有影響。
PHP中post_max_size,upload_max_filesize, MAX_FILE_SIZE的設置,和客戶端上傳給伺服器端的流量大小無關。
Apache伺服器從客戶端接收長度不超過LimitRequestBody位元組數的請求,然後傳送給php模塊,php模塊再決定是否保存成臨時文件,設置$_FILES全局變數,移交給script進一步處理。
這個Apache的LimitRequestBody選項預設值=0,允許Request body的最大位元組數是2G(Linux + Apache)
最後還要注意的是:
html本身能夠post數據也是有限制的,不能超過2G。
FTP客戶端有文件偏移指針的2GB邊界限制,未使用特殊編譯flag編譯的ftp伺服器端或者客戶端,無論在什麼FS中都不支持大於2GB的文件。不知道PHP會不會也有這種情況。
⑸ PHP 上傳文件為什麼會失敗
<form name="form1" enctype="multipart/form-data" action="upload.php" method="post">
<p></p>
上傳到files文件夾中:
<input name="upload_file" id="upload_file" type="file" style="border-color:#99CCCC; background-color:#E0EEEE;">
<input type="submit" value="上傳文件" name="submit">
</form>
e盤要有個files文件
upload.php
<?
$upload_file=$_FILES['upload_file']['tmp_name'];
$upload_file_name=$_FILES['upload_file']['name'];
if($upload_file){
$file_size_max = 2000*1000;// 2M限制文件上傳最大容量(bytes)
$store_dir = "E:/files";// 上傳文件的儲存位置
$accept_overwrite = 1;//是否允許覆蓋相同文件
// 檢查文件大小
if ($upload_file_size > $file_size_max) {
echo "對不起,您的文件容量大於規定";
exit;
}
// 檢查讀寫文件
if (file_exists($store_dir . $upload_file_name) && !$accept_overwrite) {
Echo "存在相同文件名的文件";
exit;
}
//復制文件到指定目錄
if (!move_uploaded_file($upload_file,$store_dir.$upload_file_name)) {
echo "復制文件失敗";
exit;
}
}
Echo "<p>您上傳了文件:";
echo $_FILES['upload_file']['name'];
echo "<br>";
//客戶端機器文件的原名稱。
Echo "文件的 MIME 類型為:";
echo $_FILES['upload_file']['type'];
//文件的 MIME 類型,需要瀏覽器提供該信息的支持,例如「image/gif」。
echo "<br>";
Echo "上傳文件大小:";
echo $_FILES['upload_file']['size'];
//已上傳文件的大小,單位為位元組。
echo "<br>";
Echo "文件上傳後被臨時儲存為:";
echo $_FILES['upload_file']['tmp_name'];
//文件被上傳後在服務端儲存的臨時文件名。
echo "<br>";
$Erroe=$_FILES['upload_file']['error'];
switch($Erroe){
case 0:
Echo "上傳成功"; break;
case 1:
Echo "上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值."; break;
case 2:
Echo "上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值。";break;
case 3:
Echo "文件只有部分被上傳";break;
case 4:
Echo "沒有文件被上傳";break;
}
?>
⑹ php上傳文件錯誤怎麼解決
<html>
<body>
<form enctype="multipart/form-data" action="upload.php" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
Choose a file to upload: <input name="uploaded_file" type="file" />
<input type="submit" value="Upload" />
</form>
</body>
</html>
有一些規則需要建設時遵循HTML表單。首先,請確保該窗體使用POST方法。第二,形
式需要以下屬性:字元編碼=「多重/表單數據」。它指定的內容類型時使用的信息提
交給伺服器。如果沒有這些要求,您的文件上傳不了。
另一個需要注意的是隱藏的表單欄位名為MAX_FILE_SIZE設置的值。某些Web瀏覽器實
際上反映了這個領域,也不會允許用戶上載文件超過這個數字(位元組)更大。您應該
將此值設置為配合最大上傳大小,在php.ini文件中設置。這是一套與中
upload_max_filesize,默認值是2MB的。但它仍然不能保證你的腳本將不會轉交了尺
寸較大的文件。危險的是,攻擊者將嘗試向您發送一個請求幾個大文件,並填寫了文
件系統,也就是PHP存儲解碼文件。設置在php.ini的post_max_size的指令文件的最大
尺寸,你要(必須大於中upload_max_filesize)。默認值為10MB的。此指令控制的所
有要求,在一個允許的POST數據最大大小。另外,還要確保在你的php.ini文件
file_uploads設置為On。
至少,有一個在輸入標記屬性看:類型=「文件」。它是用來指定為文件選擇控制輸入
元素。這提供了一個文件的URI的地方,則需要鍵入一個「瀏覽」按鈕,可作為替代的
URI輸入使用。
在用戶進入一個文件的URI,並點擊提交按鈕的文件的副本將被發送到伺服器和用戶將
被重定向到upload.php。此PHP文件將處理表單數據。
返回頁首
處理表單數據(PHP代碼)
當文件被上傳和PHP創建了一個文件的臨時副本,並建立了超全局變數$ _FILES數組,
包含有關文件的信息。對於每個文件,有5個數據。我們已上傳欄位命名
為'uploaded_file',所以會存在以下數據:
變數$ _FILES [「uploaded_file」] [「name」]從用戶的機器上載的文件的原名稱
變數$ _FILES [「uploaded_file」] [「type」]的上傳文件的MIME類型(如果瀏覽器
提供的類型)
變數$ _FILES [「uploaded_file」] [「size」]的以位元組為單位上傳的文件大小
變數$ _FILES [「uploaded_file」] [「tmp_name」],在該文件暫時存儲在伺服器上
的位置
變數$ _FILES [「uploaded_file」] [「error」]錯誤代碼從文件上傳結果
下面的例子接受一個上傳的文件並保存在上載目錄中。它允許根據350Kb上傳只有JPEG
圖像。該代碼本身,是相當清楚的,但我們會作出一些解釋。有一個例子在外觀和保
存此為upload.php PHP代碼。
<?php
//Сheck that we have a file
if((!empty($_FILES["uploaded_file"])) && ($_FILES['uploaded_file']['error']
== 0)) {
//Check if the file is JPEG image and it's size is less than 350Kb
$filename = basename($_FILES['uploaded_file']['name']);
$ext = substr($filename, strrpos($filename, '.') + 1);
if (($ext == "jpg") && ($_FILES["uploaded_file"]["type"] == "image/jpeg")
&&
($_FILES["uploaded_file"]["size"] < 350000)) {
//Determine the path to which we want to save this file
$newname = dirname(__FILE__).'/upload/'.$filename;
//Check if the file with the same name is already exists on the
server
if (!file_exists($newname)) {
//Attempt to move the uploaded file to it's new place
if ((move_uploaded_file($_FILES['uploaded_file']
['tmp_name'],$newname))) {
echo "It's done! The file has been saved as: ".$newname;
} else {
echo "Error: A problem occurred ring file upload!";
}
} else {
echo "Error: File ".$_FILES["uploaded_file"]["name"]." already
exists";
}
} else {
echo "Error: Only .jpg images under 350Kb are accepted for upload";
}
} else {
echo "Error: No file uploaded";
}
?>
在此之前的上載您需要的文件,以確定文件是否真的上傳任何東西。之後我們檢查上
傳的文件,JPEG圖像,其大小小於350Kb的。接下來,我們確定的道路,這是我們要保
存此文件,並檢查是否已經存在一個伺服器上的這些文件的名稱。當所有檢查通過,
我們將文件復制到一個永久的位置使用move_upload_file()函數。此功能也證實該
文件你要過程,是一個合法的文件從用戶上傳結果。如果該文件上傳成功,那麼相應
的消息將出現。
注意:要確保PHP已經允許讀取和寫入臨時文件中保存的位置是您要復制文件的目錄。
這個例子其實很簡單,它的提出是為了演示如何使用PHP上傳文件。例如,您可以添加
新的條件,並允許上傳GIF和PNG圖像,或任何文件,您需要其他種類。如果您是本教
程使用PHP不熟悉可能是一個很好的起點。
⑺ PHP上傳文件失敗
提示顯示的很清楚的。文件已經上傳了,但是在把文件從臨時文件夾移出來出錯了。注意新地址是否正確
可以使用絕對路徑或者相對路徑,看個人http://www.hi-docs.com/php/move_uploaded_file.html
⑻ PHP上傳文件無效,沒反應!
你的 $dir = "D:\\Ruby"; 是絕對路徑,是不能這樣直接寫的,要用相對路徑。因為你不知道伺服器系統的路徑,這樣的話那肯定是路徑出問題啊。就像tomcate一樣,你輸入http://localhost:8080就相當於是進入web目錄,在web目錄下自然能找到你的文件。關鍵是現在你的這個php編寫工具你知道伺服器系統路徑不,知道的話就在你的路徑D前加上完整服務端路徑,就肯定能實現效果的啦!!
呵呵!很遺憾,zend studio我不懂的,我不是用的這個php開發工具。
既然是想實現上傳效果,那你乾脆就在你這個文件所在的目錄下再建一個文件夾來裝你的上傳文件就好啦。例如是Ruby文件夾,然後就直接寫
$dir = "Ruby"; 這樣寫准沒錯的!!
祝你成功哦!!
⑼ php不能上傳文件,[error] => 2
從 PHP 4.2.0 開始,PHP 將隨文件信息數組一起返回一個對應的錯誤代碼。該代碼可以在文件上傳時生成的文件數組中的 ['error'] 欄位中被找到,也就是 $_FILES['userfile']['error']。
UPLOAD_ERR_OK
值:0; 沒有錯誤發生,文件上傳成功。
UPLOAD_ERR_INI_SIZE
值:1; 上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值。
UPLOAD_ERR_FORM_SIZE
值:2; 上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值。
UPLOAD_ERR_PARTIAL
值:3; 文件只有部分被上傳。
UPLOAD_ERR_NO_FILE
值:4; 沒有文件被上傳。
注: 這些在 PHP 4.3.0 之後變成了 PHP 常量。
************************************************************************************************************************************
按這上面說的你上傳的文件太大了.所以你在程序里最好加個對$_FILES['userfile']['error']的判斷然後給操作者一個提示.還有最好也對文件的類型進行限制,要不然也對伺服器造成不必要的麻煩上傳的文件類型在$_FILES['userfile']['type']里.
************************************************************************************************************************************