首頁 後端開發 php教程 PHP中move_uploaded_file() 函數詳解

PHP中move_uploaded_file() 函數詳解

Mar 28, 2018 am 10:08 AM
file move

本文主要和大家介紹了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[&#39;myupload&#39;][&#39;tmp_name&#39;];
  if(!move_uploaded_file($tmp_filename,"/path/to/dest/{$_FILES[&#39;myupload&#39;][&#39;name&#39;]}")) {
   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(&#39;ROOT&#39;,dirname(__FILE__).&#39;/&#39;); 
 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[&#39;file&#39;][&#39;tmp_name&#39;])){ 
    $stored_path = ROOT.&#39;/upload/&#39;.basename($_FILES[&#39;file&#39;][&#39;name&#39;]); 
     
    if(move_uploaded_file($_FILES[&#39;file&#39;][&#39;tmp_name&#39;],$stored_path)){ 
     echo "Stored in: " . $stored_path; 
    }else{ 
     echo &#39;Stored failed:file save error&#39;; 
    } 
   }else{ 
    echo &#39;Stored failed:no post &#39;; 
   } 
   } 
 } 
?>
登入後複製

當我執行執行上面的腳本時,腳本輸出"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[&#39;upfile&#39;][&#39;tmp_name&#39;])){ 
 $upfile=$_FILES["upfile"]; 
//获取数组里面的值 
 $name=$upfile["name"];//上传文件的文件名 
 $type=$upfile["type"];//上传文件的类型 
 $size=$upfile["size"];//上传文件的大小 
 $tmp_name=$upfile["tmp_name"];//上传文件的临时存放路径 
//判断是否为图片 
 switch ($type){ 
  case &#39;image/pjpeg&#39;:$okType=true; 
   break; 
  case &#39;image/jpeg&#39;:$okType=true; 
   break; 
  case &#39;image/gif&#39;:$okType=true; 
   break; 
  case &#39;image/png&#39;:$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 move_uploaded_file()函數的文章建議10篇

#

以上是PHP中move_uploaded_file() 函數詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1663
14
CakePHP 教程
1420
52
Laravel 教程
1315
25
PHP教程
1266
29
C# 教程
1239
24
php blob怎麼轉file php blob怎麼轉file Mar 16, 2023 am 10:47 AM

php blob轉file的方法:1.建立一個php範例檔;2、透過「function blobToFile(blob) {return new File([blob], 'screenshot.png', { type: 'image/jpeg' })} 」方法實作Blob轉File即可。

使用java的File.length()函數取得檔案的大小 使用java的File.length()函數取得檔案的大小 Jul 24, 2023 am 08:36 AM

使用Java的File.length()函數取得檔案的大小檔案大小是在處理檔案作業時很常見的一個需求,Java提供了一個很方便的方法來取得檔案的大小,即使用File類別的length()方法。本文將介紹如何使用此方法來取得檔案的大小,並給出對應的程式碼範例。首先,我們需要建立一個File物件來表示我們想要取得大小的檔案。以下是建立File物件的方法:Filef

鴻蒙原生應用隨機詩詞 鴻蒙原生應用隨機詩詞 Feb 19, 2024 pm 01:36 PM

想了解更多關於開源的內容,請造訪:51CTO鴻蒙開發者社群https://ost.51cto.com運行環境DAYU200:4.0.10.16SDK:4.0.10.15IDE:4.0.600一、建立應用程式點擊File- >newFile->CreateProgect。選擇模版:【OpenHarmony】EmptyAbility:填寫項目名,shici,應用包名com.nut.shici,應用儲存位置XXX(不要有中文,特殊字符,空格)。 CompileSDK10,Model:Stage。 Device

使用java的File.renameTo()函數重命名文件 使用java的File.renameTo()函數重命名文件 Jul 25, 2023 pm 03:45 PM

使用Java的File.renameTo()函數重命名檔案在Java程式設計中,我們經常需要對檔案進行重命名的操作。 Java提供了File類別來處理檔案操作,其中的renameTo()函數可以方便地重新命名檔案。本文將介紹如何使用Java的File.renameTo()函數來重新命名文件,並提供對應的程式碼範例。 File.renameTo()函數是File類別的一個方法,

使用java的File.getParent()函數取得檔案的父路徑 使用java的File.getParent()函數取得檔案的父路徑 Jul 24, 2023 pm 01:40 PM

使用java的File.getParent()函數取得檔案的父路徑在Java程式設計中,我們經常需要操作檔案和資料夾。有時候,我們需要取得一個檔案的父路徑,也就是該檔案所在資料夾的路徑。 Java的File類別提供了getParent()方法用來取得檔案或資料夾的父路徑。 File類別是Java對檔案和資料夾的抽象表示,它提供了一系列操作檔案和資料夾的方法。其中,get

使用java的File.getParentFile()函數取得檔案的父目錄 使用java的File.getParentFile()函數取得檔案的父目錄 Jul 27, 2023 am 11:45 AM

使用java的File.getParentFile()函數取得檔案的父目錄在Java程式設計中,我們經常需要操作檔案和資料夾。當我們需要取得檔案的父目錄時,可以使用Java提供的File.getParentFile()函數來完成。本文將介紹如何使用這個函數並提供程式碼範例。 Java中的File類別是用於操作檔案和資料夾的主要類別。它提供了許多方法來取得和操作文件的屬性

如何使用Java中的File.delete()方法刪除檔案或目錄? 如何使用Java中的File.delete()方法刪除檔案或目錄? Nov 18, 2023 am 08:02 AM

如何使用Java中的File.delete()方法刪除檔案或目錄?概述:在Java中,我們可以使用File類別的delete()方法來刪除檔案或目錄。此方法用於刪除指定的檔案或目錄。但是要注意的是,該方法只能刪除空目錄或沒有被其他程式開啟的檔案。如果檔案或目錄刪除失敗,可以透過擷取IOException異常來找出特定原因。步驟一:導入相關的套件首先,我們需要

使用java的File.mkdirs()函數建立多層目錄 使用java的File.mkdirs()函數建立多層目錄 Jul 24, 2023 am 11:04 AM

使用Java的File.mkdirs()函數建立多層目錄在Java中,我們經常需要建立資料夾來儲存和組織檔案。而有時候,我們需要建立多層目錄,也就是包含子資料夾的資料夾。 Java提供了File類別的mkdirs()函數來實作這個功能。 File類是Java中處理文件和目錄的類,它提供了一系列操作文件和目錄的方法。其中,mkdirs()函數是建立多層目錄的函數。下

See all articles