PHPのmove_uploaded_file()関数の実践事例を詳しく解説

php中世界最好的语言
リリース: 2023-03-26 10:58:02
オリジナル
1541 人が閲覧しました

今回は、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 で指定されたファイルに移動されます。

ファイルが合法的にアップロードされたファイルではない場合、操作は行われず、move_uploaded_file() は false を返します。

ファイルが有効なアップロード ファイルであるにもかかわらず、何らかの理由で移動できない場合、アクションは実行されず、move_uploaded_file() は false を返し、警告が発行されます。

この種のチェックは、アップロードされたファイルによってそのコンテンツがこのシステムのユーザーまたは他のユーザーに表示される可能性がある場合に特に重要です。

ヒントとメモ

注: この機能は、HTTP POST 経由でアップロードされたファイルにのみ使用されます。

注: 対象のファイルが既に存在する場合は上書きされます。

セキュリティに関する補足

w3c からの紹介として、私が遭遇した問題について話しましょう。

一般的に、保存ファイルは次のように書きます:

$fileName = $_SERVER['DOCUMENT_ROOT'].'/Basic/uploads/'.$_FILES['file']['name']; 
move_uploaded_file($_FILES['file']['tmp_name'],$fileName )
ログイン後にコピー

まず、これら 2 行のコードの意味を説明します: ファイルを直接保存します。ファイル名はユーザーがアップロードしたファイル名でもあります
わかりました、今、リスクがここにあります:

①ファイルを直接保存します。

これは、ユーザーが背景コードをアップロードして jpg などのサフィックスとして保存した場合、管理者がそれを誤って php にマッピングしてから背景にアクセスした場合、そのファイルはいかなる方法でも識別されないことを意味します。想像できますが、バックグラウンドですべてのデータベースを削除すると、Web サイト全体が直接 GG になります。つまり、ファイルを直接保存するのは非常に危険です。

②ファイル名はユーザーファイル名と同じにしてください。

ユーザーが中国語のファイル名を使用すると、上記のコードはエラーを報告します。

ファイル名が英語+数字であれば問題ありませんが、中国語が含まれている場合は大きな問題となり、再エンコードする必要があります。

信頼できるストレージは次のようにあるべきだと思います:

①ユーザーがアップロードしたファイルは識別されなければなりません。

ファイル認識、この部分には多くの機能がありますが、これも偽造が難しいMIMEタイプを使用するのが良いと思います。

②ファイル名を変更する。

ファイル名を「201803264104421」のような時刻形式に変更するか、ファイル名をデータベースと一致させることもできると思います。

追加:

には2つのパラメータがあります。最初のパラメータは、アップロード後の一時ファイル名で、システムによって自動的に生成されます。通常、スタイルは次のとおりです:

$_FILE["file"]["tmp_name"];

ファイルは、フロントエンドのファイルアップロードフォームの名前です。
2 番目のパラメータは、パスを含む新しいファイル名です。例:

"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;; 
   } 
   } 
 } 
?>
ログイン後にコピー

とき上記のスクリプトを実行すると、スクリプトは「保存に失敗しました: ファイル保存エラー」と出力しました。これは明らかにエラーです。php_error_log ファイルで、エラーが発生している場所を見つけました。発生しました: 画像を保存します 宛先ディレクトリには、PHP を実行するユーザーのアクセス許可がありません。PHP スクリプトを実行するユーザーは、スクリプト コードを記述して画像フォルダーを作成したユーザーと同じではないため、ファイルのアクセス許可を変更するだけで済みます。 777まで。

PHP開発学習ファイルアップロード(move_uploaded_file)

機能: アップロードした一時ファイルをアップロードディレクトリに移動 アップロードがルートディレクトリに作成されました。 ! !

<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 中国語 Web サイトの他の関連記事に注目してください。

推奨読書:

thinkPHP5 フレームワークでページング クエリを実装する手順の詳細な説明

Laravel ORM Model::find キャッシュ メソッドの詳細な説明

以上がPHPのmove_uploaded_file()関数の実践事例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!