検索
ホームページバックエンド開発PHPチュートリアルPHPのmove_uploaded_file()関数の実践事例を詳しく解説

今回は、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="/static/imghwm/default1.png"  data-src=".$destination."  class="lazy"   alt="PHPのmove_uploaded_file()関数の実践事例を詳しく解説" >"; 
//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 サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PHPセッションがすでに開始されているかどうかを確認するにはどうすればよいですか?PHPセッションがすでに開始されているかどうかを確認するにはどうすればよいですか?Apr 30, 2025 am 12:20 AM

PHPでは、session_status()またはsession_id()を使用して、セッションが開始されたかどうかを確認できます。 1)session_status()関数を使用します。 php_session_activeが返された場合、セッションが開始されました。 2)SESSION_ID()関数を使用します。空の文字列が返された場合、セッションが開始されます。どちらの方法でもセッション状態を効果的に確認でき、使用する方法を選択することは、PHPバージョンと個人的な好みに依存します。

Webアプリケーションでセッションを使用することが不可欠なシナリオを説明してください。Webアプリケーションでセッションを使用することが不可欠なシナリオを説明してください。Apr 30, 2025 am 12:16 AM

Sessionsionsionsarevitalinwebapplications、特にコマースプラットフォームの前。

PHPでの同時セッションアクセスをどのように管理できますか?PHPでの同時セッションアクセスをどのように管理できますか?Apr 30, 2025 am 12:11 AM

PHPでの同時セッションアクセスの管理は、次の方法で実行できます。1。データベースを使用してセッションデータを保存します。これらの方法は、データの一貫性を確保し、並行性のパフォーマンスを向上させるのに役立ちます。

PHPセッションを使用することの制限は何ですか?PHPセッションを使用することの制限は何ですか?Apr 30, 2025 am 12:04 AM

phpsessionshaveverallimitations:1)storagecconstraintscanleadtoperformanceissues; 2)securityvulnerablesliasitylikessessionfixationAttacksicexist;

負荷分散がセッション管理にどのように影響し、それに対処するかを説明します。負荷分散がセッション管理にどのように影響し、それに対処するかを説明します。Apr 29, 2025 am 12:42 AM

負荷分散はセッション管理に影響しますが、セッションの複製、セッションの粘着性、集中セッションストレージで解決できます。 1。セッションレプリケーションサーバー間のセッションデータをコピーします。 2。セッションスティンネスは、ユーザーリクエストを同じサーバーに指示します。 3.集中セッションストレージは、Redisなどの独立したサーバーを使用してセッションデータを保存してデータ共有を確保します。

セッションロックの概念を説明します。セッションロックの概念を説明します。Apr 29, 2025 am 12:39 AM

SESSIONLOCKINGISATECHNIQUESTOESUREAUSER'SSESSIONREMAINSEXCLUSIVETOONEUSATIME.ITISCRUCIALFORPREVENTINGDATACORTIONANDSECURITYBREACHESINMULTI-USERAPPLICATIONS.SESSIONLOCKINGISISIMPLEMENTEDUSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGROCKINGSMECHANISMなど

PHPセッションの選択肢はありますか?PHPセッションの選択肢はありますか?Apr 29, 2025 am 12:36 AM

PHPセッションの代替品には、Cookie、トークンベースの認証、データベースベースのセッション、Redis/Memcachedが含まれます。 1.Cookiesは、クライアントにデータを保存することによりセッションを管理します。 2.トークンベースの認証はトークンを使用してユーザーを検証します。これは非常に安全ですが、追加のロジックが必要です。 3.Databaseベースのセッションは、データベースにデータを保存します。これは、スケーラビリティが良好ですが、パフォーマンスに影響を与える可能性があります。 4. Redis/Memcachedは分散キャッシュを使用してパフォーマンスとスケーラビリティを向上させますが、追加のマッチングが必要です

PHPのコンテキストで「セッションハイジャック」という用語を定義します。PHPのコンテキストで「セッションハイジャック」という用語を定義します。Apr 29, 2025 am 12:33 AM

SessionHijackingとは、ユーザーのSessionIDを取得してユーザーになりすましている攻撃者を指します。予防方法には、次のものが含まれます。1)HTTPSを使用した通信の暗号化。 2)SessionIDのソースの検証。 3)安全なSessionID生成アルゴリズムの使用。 4)SessionIDを定期的に更新します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。