這篇文章主要介紹了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??傊苯颖4嫖募泻艽箫L險。
②使用與用戶文件名相同的文件名。
上述代碼如果用戶使用中文文件名,則會報錯。
一牽涉到文件名,就牽涉到編碼,要是文件名是英文+數字還好,如果包含中文那就頭大了,要重新對其編碼。
我認為可靠的保存,應該是這樣的:
①要對用戶上傳的文件進行識別。
文件識別,這個部分有很多功能,我覺得用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等格式的圖片!";
- }
- }
- ?>
新聞熱點
疑難解答