ホームページ >バックエンド開発 >PHPチュートリアル >PHP の move_uploaded_file() 関数
この記事では主に、アップロードされたファイルを新しい場所に移動する PHP move_uploaded_file() 関数を紹介します。必要な方は、
定義と使用法を参照してください。
#move_uploaded_file() 関数は、アップロードされたファイルを新しい場所に移動します。 成功した場合は true を返し、そうでない場合は false を返します。
#構文
move_uploaded_file(file,newloc)
#パラメータファイル | |
---|---|
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 つのコードの意味を説明します。ファイルを直接保存します。ファイル名はアップロードされたファイル名でもあります。ユーザーによる
OK、リスクはここにあります:
①ファイルを直接保存します。 これは、ユーザーが背景コードをアップロードし、それを jpg などのサフィックスとして保存した場合、管理者が誤ってそれを php にマップしてから、バックグラウンド、- - 結果 バックグラウンドですべてのデータベースを削除すると、Web サイト全体が直接 GG されることが考えられます。つまり、ファイルを直接保存するのは非常に危険です。
②ファイル名はユーザーファイル名と同じにしてください。
ユーザーが中国語のファイル名を使用すると、上記のコードはエラーを報告します。
ファイル名が英語の数字であれば問題ありませんが、漢字が含まれている場合は大きな問題になるため、再設定する必要があります。エンコードされた。
信頼できるストレージとは次のようにあるべきだと思います:
①ユーザーがアップロードしたファイルは識別される必要があります。
ファイル認識、この部分は多くの機能があり、これも偽造が難しいMIMEタイプを使用するのが良いと思います。
② ファイル名を変更します。
ファイル名を「201803264104421」のような時刻形式に変更するか、ファイル名をデータベースに対応付けることもできると思います。
補足:パラメータは 2 つあり、最初のパラメータはアップロード後の一時ファイル名で、システムによって自動的に生成されます。通常、スタイルは次のとおりです: $_FILE["file"]["tmp_name"];
ここで、file はフロントエンド ファイル アップロード フォームの名前です。
2 番目のパラメータは、パスを含む新しいファイル名です。例: "upload/1.jpg";
このようにして、アップロードしたファイルは現在のディレクトリの Upload という名前のサブディレクトリに移動され、ファイル名は次のようになります。 :1.jpg として保存されました。
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!";
}
?>
本日、ユーザー登録時にアバター画像ファイルをアップロードする 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 に変更する必要があるだけです。
関数: アップロードされた一時ファイルをアップロード ディレクトリに移動します。アップロードがルート ディレクトリに作成されました。 ! ! <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等格式的图片!";
}
}
?>
実行結果:
関連する推奨事項:
ThinkPHP のクラスのコンストラクター _construct() と _initialize() の違い #以上がPHP の move_uploaded_file() 関数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。