PHP move_uploaded_file() 函數實戰案例詳解

來源:互聯網
上載者:User
這次給大家帶來PHP move_uploaded_file() 函數實戰案例詳解,PHP move_uploaded_file() 函數使用的注意事項有哪些,下面就是實戰案例,一起來看一下。


定義和用法

move_uploaded_file()函數將上傳的檔案移動到新位置。

若成功,則返回 true,否則返回 false。

文法

move_uploaded_file(file,newloc)

參數 描述
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緩衝方法詳解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.