以前沒怎麼注意搞過文件上傳,昨天搞了一個簡單的卻發現問題還蠻多。
剛開始的程式碼如下:
uploadimg.php
<?php
//判斷是上載介面還是實作介面,如果是上載介面,顯示下面的HTML頁面
if(!$_POST['UploadAction']):
?>
<html>
<head>
<title></title>
</head>
<body><table><center>
<form enctype="multipart/form-data" name="SubmitForm" action="" method="post">
<input type="hidden" name="UploadAction" value="1">
<tr><td><input name="UploadFile" type="file" size="30"></td></tr>
<tr><td><input type="submit" name="submit" value="上傳"></td>
<td><input type="reset" name="reset" value="重置"></td></tr>
</form>
</center></table></body>
</html>
<?php
//如果是實作頁面,顯示下面的HTML頁面,並啟動PHP腳本
else:
?>
<html>
<head>
<title></title>
</head>
<body>
<?php
//www.knowsky.com初始化UploadAction的狀態
$UploadAction=0;
$UploadFile=$_POST['UploadFile'];
if(($UploadFile!="none") && ($UploadFile!=""))
{
$UploadPath=$_SERVER['DOCUMENT_ROOT']."\";
if (!is_writeable($UploadPath))
{
echo "$UploadPath目錄不可寫!"; exit;
}
else
{
echo " $UploadPath 目錄可寫!";
}
$FileName=$UploadFile_name;
if($UploadFile_size<1024)
{
$FileSize=(string)$UploadFile_size."位元組";
}
elseif($UploadFile_size<(1024*1024))
{
$FileSize=number_format((double)($UploadFile_size/1024),1)."KB";
}
else
{
$FileSize=number_format((double)($UploadFile_size/(1024*1024)),1)."KB";
}
if(!file_exists($UploadPath.$FileName))
{
if(move_uploaded_file($UploadFile,$UploadPath.$FileName))
{
echo "檔案$UploadFile_name ($FileSize) 上傳成功!";
}
else
{
echo "檔案$UploadFile_name ($FileSize) 上傳失敗!";
}
unlink($UploadPath.$FileName);
}
else
{
echo "檔案$UploadFile_name 已經存在!";
}
}
else
{
echo "你沒有選擇任何檔案上傳,或上傳的檔案超出了$MAX_FILE_SIZE !";
}
?>
<br><a href="uploadimg.php">回傳</a>
</body>
</html>
<?php
endif
?>
運行發現上傳一點效果都沒有,連實現頁面都進入不了,搜索詢問之後才曉得上傳文件獲得要用$_FILES
於是做了一些變化:
$UploadFile=$_FILES['UploadFile']['tmp_name'];
$UploadFile_size=$_FILES['UploadFile']['size'];
$UploadFile_name=$_FILES['UploadFile']['name'];
$FileName=strtolower($UploadFile_name);
本來以為這下一定搞定,結果出現錯誤訊息為:
Warning: move_uploaded_file(F:Serverwww): failed to open stream: Permission denied in F:Serverwwweooolfinishuploadimg.php on line 76
Warning: move_uploaded_file(): Unable to move 'E:WINDOWSTEMPphp34.tmp' to 'F:\Server\www' in F:Serverwwweooolfinishuploadimg.php on line 76
檔案*****(****位元組) 上傳失敗!
而我是在WIN系統上進行調試,應該不存在文件權限問題,自己看了又看,想了又想,卻仍然不得其法,在落伍和喜悅都發帖求救,卻沒有得到正確的答案,僅僅一個簡單的文件上傳費了我1天多的時間仍然搞不定,讓我很是喪氣,網上又搜索不到與我類似的錯誤。
最後沒辦法,我想到為何用sablog調試的時候上傳附件可以成功呢?於是仔細看了下sablog的附件上傳的原程式碼,參考其程式碼又做了以下變化:
function getextension($filename) {
return substr(strrchr($filename, "."), 1);
}
$extension=getextension($FileName);
if(move_uploaded_file($UploadFile,$UploadPath."temp.".$extension))
//unlink($UploadFile);
unlink($UploadPath."temp.".$extension);
結果馬上收到效果,上傳成功!
我這裡用到unlink($UploadPath."temp.".$extension);是為了馬上刪除掉上傳到空間的文件,節省空間。