この記事では、アップロードされたファイルを実際に新しい場所に移動する 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"];
ここで、file はフロントエンド ファイル アップロード フォームの名前です。
2 番目のパラメータは、パスを含む新しいファイル名です。例:
"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 '; } } } ?>
上記のスクリプトを実行すると、スクリプトは「保存に失敗しました: ファイル保存エラー」と出力しました。これは明らかにエラーでした。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['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 move_uploaded_file() 関数に関する推奨記事 10 件
以上がPHPのmove_uploaded_file()関数の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。