參數 | ##描述說明 |
file | 必要。規定要移動的文件。 |
newloc | 必要。規定文件的新位置。 |
說明
本函數檢查並確保由 file 指定的檔案是合法的上傳檔案(即透過 PHP 的 HTTP POST 上傳機制所上傳的)。如果文件合法,則將其移動為由 newloc 指定的文件。
如果 file 不是合法的上傳文件,不會出現任何動作,move_uploaded_file() 將會傳回 false。
如果 file 是合法的上傳文件,但由於某些原因無法移動,不會出現任何操作,move_uploaded_file() 將返回 false,此外還會發出警告。
這種檢查顯得格外重要,如果上傳的檔案有可能會造成對使用者或本系統的其他使用者顯示其內容的話。
提示與註解
註解:本函數僅用於透過 HTTP POST 上傳的檔案。
注意:如果目標檔案已經存在,將會被覆寫。
安全補充
來自w3c的介紹,下面說說我遇到的問題。
一般來說,我們都會這樣寫儲存檔案:
$fileName = $_SERVER['DOCUMENT_ROOT'].'/Basic/uploads/'.$_FILES['file']['name'];
move_uploaded_file($_FILES['file']['tmp_name'],$fileName )
先解釋,這兩句程式碼的意思:直接儲存文件,同時檔案名稱也為使用者上傳的檔案名稱
好了,這下子風險來了:
①直接儲存檔案。
這意味著不對文件進行任何識別,如果有用戶上傳了一段後台代碼保存為jpg後綴或者其他,要是管理員一不注意將其以php映射,然後訪問這個後台,- -結果可想而知,要是他在後台執行刪除所有資料庫,整個網站直接GG。總之直接保存文件有很大風險。
②使用與使用者檔案名稱相同的檔案名稱。
上述程式碼如果使用者使用中文檔名,則會報錯。
一牽涉到檔案名,就牽涉到編碼,要是檔案名稱是英文 數字還好,如果包含中文那就頭大了,要重新對其編碼。
我認為可靠的保存,應該是這樣的:
①要對使用者上傳的檔案進行識別。
檔案識別,這個部分有很多功能,我覺得用MIME type就很好,這個也很難偽造。
②要將檔案名稱改換。
我覺得最好改成時間的格式像「201803264104421」這種檔名,也可以將檔名與資料庫相對應起來。
補充:
有兩個參數,第一個參數是你上傳後的暫存檔案名,由系統自動產生。通常其樣式為:
$_FILE["file"]["tmp_name"];
其中的file為你前台檔案上傳表單的名稱。
第二個參數就是包含有路徑的新的檔名。如:
"upload/1.jpg";
這樣,就會把你上傳的文件,移到目前目錄下名稱upload的子目錄下,並把檔案名稱儲存為:1.jpg。
move_uploaded_file()函數實例
使用move_uploaded_file()函數上傳檔案到伺服器。
<?php
$tmp_filename = $_FILES['myupload']['tmp_name'];
if(!move_uploaded_file($tmp_filename,"/path/to/dest/{$_FILES['myupload']['name']}")) {
echo "An error has occurred moving the uploaded file.<BR>";
echo "Please ensure that if safe_mode is on that the " . "UID PHP is using matches the file.";
exit;
} else {
echo "The file has been successfully uploaded!";
}
?>
move_uploaded_file上傳檔案失敗的案例及解決方法
今天在實作一個在使用者註冊時上傳頭像圖片檔案的PHP腳本時,出現了問題:php腳本程式碼如下:
<?php
define('ROOT',dirname(FILE).'/');
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_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 "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
if(is_uploaded_file($_FILES['file']['tmp_name'])){
$stored_path = ROOT.'/upload/'.basename($_FILES['file']['name']);
if(move_uploaded_file($_FILES['file']['tmp_name'],$stored_path)){
echo "Stored in: " . $stored_path;
}else{
echo 'Stored failed:file save error';
}
}else{
echo 'Stored failed:no post ';
}
}
}
?>
當我執行執行上面的腳本時,腳本輸出"Stored failed:file save error",很明顯是出錯了.在php_error_log檔案中我看到了出錯問題:權限不夠,我終於找到了出錯的地方:我們存放圖片的目的目錄對執行PHP的用戶來說是沒有權限的,執行PHP腳本的用戶和我寫腳本代碼、建立圖片資料夾的用戶不是同一個用戶,因此只需要將檔案權限改為777即可。
PHP開發學習 檔案上傳(move_uploaded_file)
#功能:把上傳的臨時檔案移到upload目錄下面,upload是在根目錄下已經建立好的! ! !
<form action="" enctype="multipart/form-data" method="post"
name="uploadfile">上传文件:<input type="file" name="upfile" /><br>
<input type="submit" value="上传" /></form>
<?php
//print_r($_FILES["upfile"]);
if(is_uploaded_file($_FILES['upfile']['tmp_name'])){
$upfile=$_FILES["upfile"];
//获取数组里面的值
$name=$upfile["name"];//上传文件的文件名
$type=$upfile["type"];//上传文件的类型
$size=$upfile["size"];//上传文件的大小
$tmp_name=$upfile["tmp_name"];//上传文件的临时存放路径
//判断是否为图片
switch ($type){
case 'image/pjpeg':$okType=true;
break;
case 'image/jpeg':$okType=true;
break;
case 'image/gif':$okType=true;
break;
case 'image/png':$okType=true;
break;
}
if($okType){
/**
* 0:文件上传成功<br/>
* 1:超过了文件大小,在php.ini文件中设置<br/>
* 2:超过了文件的大小MAX_FILE_SIZE选项指定的值<br/>
* 3:文件只有部分被上传<br/>
* 4:没有文件被上传<br/>
* 5:上传文件大小为0
*/
$error=$upfile["error"];//上传后系统返回的值
echo "================<br/>";
echo "上传文件名称是:".$name."<br/>";
echo "上传文件类型是:".$type."<br/>";
echo "上传文件大小是:".$size."<br/>";
echo "上传后系统返回的值是:".$error."<br/>";
echo "上传文件的临时存放路径是:".$tmp_name."<br/>";
echo "开始移动上传文件<br/>";
//把上传的临时文件移动到upload目录下面(upload是在根目录下已经创建好的!!!)
move_uploaded_file($tmp_name,"upload/".$name);
$destination="upload/".$name;
echo "================<br/>";
echo "上传信息:<br/>";
if($error==0){
echo "文件上传成功啦!";
echo "<br>图片预览:<br>";
echo "<img src=".$destination.">";
//echo " alt=\"图片预览:\r文件名:".$destination."\r上传时间:\">";
}elseif ($error==1){
echo "超过了文件大小,在php.ini文件中设置";
}elseif ($error==2){
echo "超过了文件的大小MAX_FILE_SIZE选项指定的值";
}elseif ($error==3){
echo "文件只有部分被上传";
}elseif ($error==4){
echo "没有文件被上传";
}else{
echo "上传文件大小为0";
}
}else{
echo "请上传jpg,gif,png等格式的图片!";
}
}
?>
執行結果:
相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
推薦閱讀:
thinkPHP5框架實作分頁查詢步驟詳解
Laravel ORM對Model::find快取方法詳解
#