PHPファイルのアップロード
アップロード機能を正常に実装するには、まず php.ini でファイルのアップロードを有効にし、いくつかのパラメーターを適切に設定する必要があります。ファイル アップロード項目を見つけると、以下の意味を持つ 3 つの属性があることがわかります。
file_upload: 値が on の場合、サーバーがファイルのアップロードをサポートしていることを意味します。それ以外の場合はその逆です
upload_tmp_dir: ファイルをアップロードするための一時ディレクトリ。ファイルが正常にアップロードされる前に、ファイルはまずサーバーの一時ディレクトリに保存されます。場所を知りたい場合は、後でストレージ パスを設定できます。それ以外の場合は、システムのデフォルト ディレクトリを使用します。
upload_max_filesize: サーバーによってアップロードできるファイルの最大サイズ (MB 単位)。システムのデフォルトは 2MB で、ユーザーが自分で設定できます
★ 統合インストールパッケージを使用して PHP 開発環境を構成する場合、上記で紹介した構成情報がデフォルトで構成されています。
ファイルのアップロード手順
PHPをより良く学ぶために、複雑なPHPファイルのアップロードを6つの手順にまとめました。
実際の使用では、次の 6 つの手順に従って PHP ファイルのアップロードを正常に完了できます:
1. エラー コードがあるかどうかを確認します
システムから返されるエラー コードの詳細な説明:
エラーコード | 説明 |
0はい、ファイルのアップロードの後続の操作を続行できます。 | |
| |
2 | 指定されたファイル サイズを超えました。プロジェクトのビジネス ニーズに応じて、アップロードされるファイルのサイズ制限を指定してください |
3 | 一部のファイルのみがアップロードされました |
4 | ファイルはアップロードされませんでしたアップロードされました |
6 | ディレクトリが存在しないか、権限が利用できない可能性があります |
7 | ディスクがいっぱいであるか、権限が利用できない可能性があります |
注意★:エラーコードに5はありません
2.アップロード機能を開発する際に、ファイルサイズが範囲
を超えるかどうかをカスタマイズします。開発者として、php.ini で指定された最大アップロード値に加えて、
通常、企業が指定したアップロード サイズ制限である値も設定します。
例:
Sina Weibo または QQ Zone では、2M の 1 つのアバター写真のみが許可されます。アルバムをアップロードする場合は、2M を超えてアップロードできます。
そのため、そのシステムはより大きなファイルのアップロードをサポートしています。
ここでの判定ファイルサイズは、実際の業務で指定したいアップロードファイルサイズを制限するために使用されます。
3. サフィックス名と MIME タイプが一致するかどうかを確認します
MIME (MultiPurpose Internet Mail Extensions) は多目的ですインターネットメール拡張子の種類。特定の拡張子を持つファイルをアプリケーションで開くように設定するメソッドの一種で、その拡張子のファイルにアクセスすると、ブラウザは指定されたアプリケーションを使用して自動的にそのファイルを開きます。これは主に、クライアント定義のファイル名とメディア ファイルを開く方法を指定するために使用されます。
サフィックスと MIME タイプを決定するときは、2 つのパラメーターを渡す PHP 関数 in_array() を使用します。
最初のパラメータは判定される値です。
2 番目のパラメータは範囲配列です。
この関数を使用して、ファイル拡張子と MIME タイプが許可された範囲内であるかどうかを判断します。
4. ファイル名を生成します
ファイルは正常にアップロードされましたが、元の名前は保存されません。
元の名前にデリケートなキーワードが含まれている一部の人々は、我が国の関連法規制に違反する可能性があるためです。
date()、mt_rand()、または unique() を使用して、ランダムなファイル名を生成できます。
5. ファイルがアップロードされているかどうかを確認します。
ファイルは正常にアップロードされましたが、元の名前は保存されません。
date()、mt_rand()、または unique() を使用して、ランダムなファイル名を生成できます。ファイルのアップロードが成功すると、システムはアップロードされた一時ファイルをシステムの一時ディレクトリにアップロードします。一時ファイルを作成します。
同時に一時ファイル名も生成されます。必要なのは、一時ファイルをシステム上の指定されたディレクトリに移動することです。
動く前にやみくもに動かない、あるいは間違った動きをするのは非科学的です。移動する前に、関連する関数を使用して、アップロードされたファイルが一時ファイルであるかどうかを判断する必要があります。
is_uploaded_file() はパラメータ ($_FILES にキャッシュされたファイル名) を渡して、渡された名前がアップロードされたファイルかどうかを判断します。
6. 一時ファイルを指定したディレクトリに移動します
一時ファイルは実際の一時ファイルです。Web サイトのディレクトリに移動する必要があります。
当社のウェブサイトディレクトリ内のデータに他の人がアクセスできるようにします。
move_uploaded_file() を使用します。
この関数は、アップロードされたファイルを指定された場所に移動し、名前を付けます。
2 つのパラメータを渡します:
最初のパラメータは、移動を指定するアップロードされたファイルです。
2 番目のパラメータは、指定されたフォルダと名前を連結した文字列です。
ファイルをアップロードするには、Webページにフォームを用意する必要があります。以下のように
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>PHP中文网</title> </head> <body> <form action="file.php" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="上传"> </form> </body> </html>
注意事項:
1. フォームフォームのパラメータメソッドはpostである必要があります。 get の場合、ファイルのアップロードは実行できません
2. enctype は multipart/form-dat である必要があります
3。type=file が選択されている場合、デフォルトではファイルのコンテンツをアップロードします。
上記のフォームで送信されたファイルの内容は、file.php を指します。
アップロードされたファイルは、file.php の PHP コードを通じて処理されます。
アップロードする名前の付いた写真を選択します。画像の名前が .jpg であるとします。クリックしてアップロードします。
PHP はファイルデータ専用のシステム関数 $_FILES を用意しており、アップロードされたファイルの関連データはすべてこのシステム関数に保存されます。
PHP ファイルで、$_FILES を出力して、この配列の構造を観察します。
<?php //var_dump()或print_r() //打印变量的相关信息,将变量的信息详细的展示出来 var_dump($_FILES); ?>
プログラムの実行結果:
array(1) {
["file"]=>
array(5) {
["名前"]=>
string(7) "psu.jpg"
["type"]=>
string(10) "image/jpeg"
["tmp_name"]=>
string(22 ) "C:WindowsphpE2F1.tmp" ["error"]=>
int(0)
["size"]=>
int(488929)
}
}
出力結果の配列構造は次のとおりです:
array (size=1)
'file' =>
array (size=5)
//ファイル名
'name' => 文字列 'psu.jpg' (length=7)
//ファイルmimeタイプ '型' =&gt;
ファイル処理プロセスを開始できます
。
最初のステップはエラーコードを特定することです<?php header("Content-type:text/html;charset=utf-8"); if($_FILES['file']['error'] > 0){ switch ($_FILES['file']['error']) { //错误码不为0,即文件上传过程中出现了错误 case '1': echo '文件过大'; break; case '2': echo '文件超出指定大小'; break; case '3': echo '只有部分文件被上传'; break; case '4': echo '文件没有被上传'; break; case '6': echo '找不到指定文件夹'; break; case '7': echo '文件写入失败'; break; default: echo "上传出错<br/>"; } }else{ echo "上传成功";//错误码为0,即上传成功,可以进行后续处理,处理流程见下文 } ?>
上記のコードは、エラーコードと対応するエラーを詳細に示しています。エラーコードに基づいて正確なエラープロンプトを生成できます。
2 番目のステップは、ファイルがサイズを超えているかどうかを判断することです。
実際のプロジェクトでは、システムハードウェアの制限とストレージデバイスの制限により、ユーザーが無制限にファイルをアップロードすることは不可能であるため、ユーザーがアップロードするファイルのサイズを制限する必要があります。適切な制限サイズを定義すると、アプリケーションをより安定して実行できます。
<?php header("Content-type:text/html;charset=utf-8"); if($_FILES['file']['error'] > 0){ //有错误可停止执行 }else { //当前上传文件无误,运行本段代码 //判断文件是否超出了指定的大小 //单位为byte $MAX_FILE_SIZE = 100000 if ($_FILES['file']['size'] > $MAX_FILE_SIZE) { //判断,如果上传的文件,大小超出了我们给的限制范围,退上传并产生错误提示 exit("文件超出指定大小"); } } ?>$MAX_FILE_SIZE として指定するファイル サイズを定義します。この変数のカウント単位はバイトであり、アップロードされたファイルの $_FILES['file']['size'] のサイズに対応します。
サンプルコードでは、サイズが約100K以下のファイルが制限となります。
3 番目のステップは、ファイルの MIME タイプが正しいかどうかを確認することです。
MIME タイプとサフィックス名を使用して、ユーザーがアップロードしたファイルが要件を満たしているかどうかを判断します。
以下のコード例では、現在のプロジェクト要件がアップロードされた画像を指定し、サフィックス GIF または jpg が付いたファイルのアップロードを要求することを想定しています。ユーザーが要件を満たさないファイルをアップロードすると、エラー メッセージが表示されます。が返されます。
/* サフィックス名と MIME タイプが指定された要件を満たしているかどうかを確認します
例:
現在のプロジェクトでは、サフィックス .jpg または .gif が付いた画像のアップロードを指定している場合、 $allowSuffix = array('jpg','gif ');
* /
//許可されるサフィックス名の配列を定義します
$myImg =explode('.', $_FILES['file']['name']);
/*
explode() を使用します指定された文字列を文字に変換して配列を返します。ここではファイル名を「.」で切り取り、その結果を $myImg に格納します。その結果が配列の最後の値です
*/
$。 myImgSuffix = array_pop($ myImg);
/*
アップロードされたファイル名に基づいてファイルのサフィックス名を取得します
アップロードされたファイルが要件を満たしているかどうかを判断するには、in_array()関数を使用します
ファイルのサフィックス名が満たされていない場合許可された範囲内であれば、アップロードを終了してエラー メッセージを返します
* /
if(!in_array($myImgSuffix, $allowSuffix)){ユーザーがファイルのサフィックスを変更してファイルが使用できなくなります。
MIME タイプも制限する必要があります。MIME タイプをチェックする目的は、アップロード者がファイル拡張子を直接変更して、ファイルが利用できなくなったり、アップロードされたファイルが要件を満たさなかったりすることを防ぐことです。 image/gif"
) ;
if(!in_array($_FILES['file']['type'], $allowMime)){チェックしてください');
//範囲外の場合許可された範囲を超えている場合は、アップロードを終了し、エラー メッセージを返します
}
ステップ 4、指定されたパスとファイル名を生成します。
ファイルの保存パスは、プロジェクトのファイル配置に応じて、ファイル名の重複によるエラーを避けるために、特定の形式に従ってランダムに生成されます。
プロジェクトのファイル配置に応じて、ファイル名の重複によるエラーを避けるために、特定の形式に従ってランダムなファイル名が生成されます。
//アップロードフォルダーを指定します
$path = "upload/images/";
/*
現在時刻に基づいてランダムなファイル名を生成します このコード行は、現在時刻 + 乱数で構成されます。 from 0-9 ファイル名、接尾辞は先ほど取得したファイル接尾辞です
*/
$name = date('Y').date('m').date("d").date(' H').date ('i').date('s').rand(0,9).'.'.$myImgSuffix;
5 番目のステップは、ファイルがアップロードされます。
is_uploaded_file()関数は、対象ファイルがアップロードされたファイルかどうかを判定する専用関数です。
<?php
// is_uploaded_file() を使用して、アップロードされたファイルかどうかを判断します
if(is_uploaded_file($_FILEs['file']['tmp_name'])) {
}
?>
ステップ 6、ファイルを指定された場所に移動します。
move_uploaded_file() 関数を使用して、ファイルを指定した場所に移動し、名前を付けます。 Linux システムにはターゲット ディレクトリに対するアクセス許可があり、ディスク容量が十分であるかどうかが考慮されることに注意してください。そうでない場合、アップロード操作は失敗します。
/*
PHPのファイル。ただし、便宜上、複数のファイルを同時にアップロードする必要がある場合があります。複数ファイルのアップロードの原理は同じですが、データを処理する場合、アップロードされたデータを特別に処理する必要があります。
move_uploaded_file() を使用して、アップロードされたファイルを指定した場所に移動します。最初のパラメーターはアップロードされたファイルで、2 番目のパラメーターは前に指定したアップロード パスと名前です。
*/
if(move_uploaded_file($_FILEs['file']['tmp_name'], $path.$name)){
*動き ファイルの移動に失敗しました。ディスクに十分なスペースがあるかどうかを確認してください。*/
echo 'アップロードに失敗しました'; このファイルの断片をファイル全体に整理します: 写真をアップロードする簡単なプログラム
詳細は例 1 を参照してください
単一ファイルをアップロードするプロセスを紹介します
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>PHP中文网</title> </head> <body> <html> <body> <form action="morefile.php" method="post" enctype="multipart/form-data"> <input type="file" name="file[]"> <input type="file" name="file[]"> <input type="submit" value="上传"> </form> </body> </html> </body> </html>
これは簡単なアップロード ページで、フォームは 2 つのファイルを同時に送信します。このページからコンテンツを送信できます。
注:
1. input type="file" name="file[]" 以前と比較して、ファイル
の後に余分な角括弧が追加されています。2 つ以上の input type="file " name="file[]" 配列構造は以下の通りです
配列 (size=1)
'file' =>
array (size=5) 'name' =>
配列 (size=2)
// ファイル名
0 => ' (length=7)
1 => string 'qwe.jpg' (length=7)
//ファイル MIME タイプ
'type' => array (size=2) 0 => string 'image /jpeg ' (length = 10)
1 = & gt; string' image/jpeg '(length = 10)
// キャッシュ ファイル
' tmp_name '= & gt;
(size = 2)
0 = & gt; : Wamptmpphpf6d5.tmp '(length = 23)
1 = & gt; string' e: wamptmphpf6f5.tmp '(length = 23)
ファイルエラー情報
' error '= & gt;
Array (size = 2)
0 => int 0
1 => int 0 // ファイルサイズを使用して を使用して を通して を通して を通して を通して を通して を通して を通して
1 => int 151651
2 つのファイルが配列に格納されており、キー名がアップロードされた 1 つのファイルと同じであることがわかります。したがって、for() ループを使用して、2 つのファイルからそれぞれ必要なデータを取得する必要があります。
2 つのファイルのデータが $_FILES に同時に保存されます。単純なループを使用して、1 つのファイルの情報を読み取り、ファイルを配置したい場所に移動する必要があります。for ($i=0; $i < count($_FILE['file']['name']); $i++) {
}
/*
is_uploaded_file() 関数を使用して、ファイルがアップロードされました
がありません エラーが発生しました
*/
if(is_uploaded_file($_FILEs['file']['tmp_name'][$i]) && $_FILEs['file']['error'][$ i] == 0){
if(move_uploaded_file($_FILEs['file']['tmp_name'][$i],'upload/'.$_FILE['file']['name'][$i] )){
// Move_uploaded_file () 関数を使用してファイルを指定された場所に移動し、ファイルの元の名前を使用します
echo "upload success"
}} else {
}}}} {
{{'' '{{{
{{{{{{{{{{{{{{m m m' failed '
}
詳しい判定プロセスについては、を参照してください。ここでは基本的な判断のみが行われ、ファイルのサイズや形式についての注意はありません。インスタンス1
画像プログラムをアップロードプログラム1 HTMLページ
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>PHP中文网</title> </head> <body> <form action="file-upload.php" enctype="multipart/form-data" method="post" name="uploadfile"> 上传文件:<input type="file" name="upfile" /><br> <input type="submit" value="上传" /></form> </form> </body> </html>プログラム2
PHPページに送信<?php header("Content-type:text/html;charset=utf-8"); //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 "上传文件名称是:".$name."<br/>"; echo "上传文件类型是:".$type."<br/>"; echo "上传文件大小是:".$size."<br/>"; echo "上传后系统返回的值是:".$error."<br/>"; echo "上传文件的临时存放路径是:".$tmp_name."<br/>"; echo "开始移动上传文件<br/>"; //把上传的临时文件移动到指定目录下面 move_uploaded_file($tmp_name,'D:\upload/images/'.$name); $destination="D:\upload/images/".$name; echo "上传信息:<br/>"; if($error==0){ echo "文件上传成功啦!"; }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等格式的图片!"; } } ?>
アップロードする写真を見つけて、プログラムの実行結果を見てください例 2
この例には 4 つのファイル アップロード フィールドがあります。送信後にアップロードされたファイル情報は、$_FILES[] に保存されます。 u_file] 、多次元配列を生成します。アレイ情報を読み取り、ファイルをアップロードします。
プログラム 1 html ページ
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>PHP中文网</title> </head> <body> <html> <body> <p>请选择要上传的文件</p> <form action="morefile.php" method="post" enctype="multipart/form-data"> <table border="1" bgcolor="f0f0f0"> <tr> <td>上传文件</td> <td><input type="file" name="u_file[]"></td> </tr> <tr> <td>上传文件</td> <td><input type="file" name="u_file[]"></td> </tr> <tr> <td>上传文件</td> <td><input type="file" name="u_file[]"></td> </tr> <tr> <td>上传文件</td> <td><input type="file" name="u_file[]"></td> </tr> <tr> <td colspan="2"><input type="submit" value="上传"></td> </tr> </table> </form> </body> </html> </body> </html>プログラム 2 php ページに送信
<?php header("Content-type:text/html;charset=utf-8"); if(!empty($_FILES[u_file][name])){ //判断遍历$_FILES是否为空 $file_name=$_FILES[u_file][name]; //将上传文件名另存为数组 $file_tmp_name=$_FILES[u_file][tmp_name]; //将上传的临时文件名另存为数组 for($i=0;$i<count($file_name);$i++){ //循环上传文件 if($file_name[$i]!=""){ //判断上传文件名是否为空 move_uploaded_file($file_tmp_name[$i],$i.$file_name[$i]); echo "文件" .$file_name[$i] ."上传成功。更名为"."$file_name[$i]"."<br>"; } } } ?>
プログラムを実行して見てください例 3
この例では、フォームをアップロードします。アップロードサイズ1MB 未満のファイルに対してプログラムを実行します
<from action="" method="POST" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="上传"> </from> <?php if(!empty($_FILES[file][name])){ //判断是否有文件上传 $fileinfo=$_FILES[file]; //将文件信息赋给变量$fileinfo if($fileinfo['size']<1000000 && $fileinfo['size']>0){ //判断文件大小 echo "上传成功"; }else{ echo "上传文件太大或未知"; } } ?>。
🎜🎜