PHPでは、ファイルのアップロードは非常に一般的な要件です。 move_uploaded_file()関数を介して、アップロードされたファイルを一時フォルダーから指定されたターゲットディレクトリに安全に移動し、ファイル管理を実現できます。この記事では、move_uploaded_file()関数を組み合わせて、シンプルで実用的なファイル管理システムを構築する方法を紹介します。
move_uploaded_file()は、アップロードされたファイルを一時的なディレクトリからターゲットディレクトリに移動するためのPHPに組み込み関数です。構文は次のとおりです。
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">move_uploaded_file</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$filename</span></span><span> , </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$destination</span></span><span> )
</span></span>
$ filename :移動するアップロードファイルへの一時ファイルパスを示します。
$宛先:最終保存されたファイルへの宛先パスを表します。
この関数は、HTTP Postを介してファイルがアップロードされ、一時ファイルが存在する場合にのみ正常に実行できます。アップロードされたファイルが違法である場合、またはターゲットパスが書かれていない場合、関数はfalseを返します。
まず、ユーザーがファイルをアップロードできるシンプルなHTMLフォームを構築する必要があります。サンプルコードは次のとおりです。
<span><span><span class="hljs-tag"><<span class="hljs-name">form</span></span></span><span> </span><span><span class="hljs-attr">action</span></span><span>=</span><span><span class="hljs-string">"upload.php"</span></span><span> </span><span><span class="hljs-attr">method</span></span><span>=</span><span><span class="hljs-string">"post"</span></span><span> </span><span><span class="hljs-attr">enctype</span></span><span>=</span><span><span class="hljs-string">"multipart/form-data"</span></span><span>>
</span><span><span class="hljs-tag"><<span class="hljs-name">label</span></span></span><span> </span><span><span class="hljs-attr">for</span></span><span>=</span><span><span class="hljs-string">"file"</span></span><span>>[ファイルのアップロード]を選択します:</span><span><span class="hljs-tag"></<span class="hljs-name">label</span></span></span><span>>
</span><span><span class="hljs-tag"><<span class="hljs-name">input</span></span></span><span> </span><span><span class="hljs-attr">type</span></span><span>=</span><span><span class="hljs-string">"file"</span></span><span> </span><span><span class="hljs-attr">name</span></span><span>=</span><span><span class="hljs-string">"file"</span></span><span> </span><span><span class="hljs-attr">id</span></span><span>=</span><span><span class="hljs-string">"file"</span></span><span>>
</span><span><span class="hljs-tag"><<span class="hljs-name">input</span></span></span><span> </span><span><span class="hljs-attr">type</span></span><span>=</span><span><span class="hljs-string">"submit"</span></span><span> </span><span><span class="hljs-attr">value</span></span><span>=</span><span><span class="hljs-string">"ファイルをアップロードします"</span></span><span>>
</span><span><span class="hljs-tag"></<span class="hljs-name">form</span></span></span><span>>
</span></span>
この形式では、 enctype = "multipart/form-data"はフォームのデータ型を指定して、ファイルを正しくアップロードできるようにします。入力タグのtype = "ファイル"を使用して、ユーザーにファイルを選択させます。
ファイルアップロードの処理スクリプト( upload.phpなど)では、 move_uploaded_file()を使用して、ファイルを一時的な場所から指定された宛先フォルダーに移動します。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// ディレクトリをアップロードします</span></span><span>
</span><span><span class="hljs-variable">$uploadDir</span></span><span> = </span><span><span class="hljs-string">'uploads/'</span></span><span>;
</span><span><span class="hljs-comment">// ターゲットフォルダーが存在するかどうかを確認します,存在しない場合は作成します</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">is_dir</span></span><span>(</span><span><span class="hljs-variable">$uploadDir</span></span><span>)) {
</span><span><span class="hljs-title function_ invoke__">mkdir</span></span><span>(</span><span><span class="hljs-variable">$uploadDir</span></span><span>, </span><span><span class="hljs-number">0755</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
}
</span><span><span class="hljs-comment">// ファイルアップロードがあるかどうかを確認してください</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$_FILES</span></span><span>[</span><span><span class="hljs-string">'file'</span></span><span>]) && </span><span><span class="hljs-variable">$_FILES</span></span><span>[</span><span><span class="hljs-string">'file'</span></span><span>][</span><span><span class="hljs-string">'error'</span></span><span>] == </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-comment">// 获取ファイルをアップロードします的信息</span></span><span>
</span><span><span class="hljs-variable">$fileName</span></span><span> = </span><span><span class="hljs-variable">$_FILES</span></span><span>[</span><span><span class="hljs-string">'file'</span></span><span>][</span><span><span class="hljs-string">'name'</span></span><span>]; </span><span><span class="hljs-comment">// ファイル名</span></span><span>
</span><span><span class="hljs-variable">$fileTmpName</span></span><span> = </span><span><span class="hljs-variable">$_FILES</span></span><span>[</span><span><span class="hljs-string">'file'</span></span><span>][</span><span><span class="hljs-string">'tmp_name'</span></span><span>]; </span><span><span class="hljs-comment">// 一時ファイルパス</span></span><span>
</span><span><span class="hljs-variable">$fileSize</span></span><span> = </span><span><span class="hljs-variable">$_FILES</span></span><span>[</span><span><span class="hljs-string">'file'</span></span><span>][</span><span><span class="hljs-string">'size'</span></span><span>]; </span><span><span class="hljs-comment">// ファイルサイズ</span></span><span>
</span><span><span class="hljs-variable">$fileType</span></span><span> = </span><span><span class="hljs-variable">$_FILES</span></span><span>[</span><span><span class="hljs-string">'file'</span></span><span>][</span><span><span class="hljs-string">'type'</span></span><span>]; </span><span><span class="hljs-comment">// ファイルタイプ</span></span><span>
</span><span><span class="hljs-comment">// ターゲットファイルパスを設定します</span></span><span>
</span><span><span class="hljs-variable">$destination</span></span><span> = </span><span><span class="hljs-variable">$uploadDir</span></span><span> . </span><span><span class="hljs-title function_ invoke__">basename</span></span><span>(</span><span><span class="hljs-variable">$fileName</span></span><span>);
</span><span><span class="hljs-comment">// 检查ファイルサイズ(たとえば、最大ファイル制限はです 5MB)</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$fileSize</span></span><span> > </span><span><span class="hljs-number">5</span></span><span> * </span><span><span class="hljs-number">1024</span></span><span> * </span><span><span class="hljs-number">1024</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ファイルが大きすぎる,最大許容 5MB。"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// ファイルをターゲットディレクトリに移動します</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">move_uploaded_file</span></span><span>(</span><span><span class="hljs-variable">$fileTmpName</span></span><span>, </span><span><span class="hljs-variable">$destination</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ファイルアップロードに正常にアップロードします!ファイル名:"</span></span><span> . </span><span><span class="hljs-title function_ invoke__">htmlspecialchars</span></span><span>(</span><span><span class="hljs-variable">$fileName</span></span><span>);
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ファイルのアップロードに失敗しました!"</span></span><span>;
}
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ファイルアップロードまたはファイルアップロードエラーはありません!"</span></span><span>;
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
上記のコードでは、最初にファイルのアップロードがあるかどうかを確認し、アップロードプロセス中にエラーがあるかどうかを確認します。次に、ファイルの一時パスとファイル名を取得し、ファイルの最終ストレージ場所としてターゲットフォルダー(アップロード/ )を指定します。ターゲットフォルダーが存在しない場合、スクリプトは自動的にフォルダーを作成します。
次に、 Move_uploaded_file()関数を使用して、ファイルを一時パスからターゲットフォルダーに移動します。移動が成功した場合、スクリプトは成功メッセージを出力します。
基本的なファイルアップロード関数の上で、ファイル管理システムの機能をさらに強化し、次の共通操作を提供できます。
ターゲットディレクトリのファイルリストを読み取ることで、すべてのアップロードされたファイルをリストできます。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$files</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_diff</span></span><span>(</span><span><span class="hljs-title function_ invoke__">scandir</span></span><span>(</span><span><span class="hljs-variable">$uploadDir</span></span><span>), </span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-string">'..'</span></span><span>, </span><span><span class="hljs-string">'.'</span></span><span>));
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<ul>"</span></span><span>;
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$files</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<li><a href='<span class="hljs-subst">{$uploadDir}</span></span></span><span><span class="hljs-subst">{$file}</span></span><span>'></span><span><span class="hljs-subst">{$file}</span></span><span></a></li>";
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"</ul>"</span></span><span>;
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
このコードはScandir()関数を使用して、ディレクトリ内のすべてのファイルを取得してフィルタリングします。そして.. 、そしてファイル名をハイパーリンクとして表示します。
また、ファイルを削除する機能を提供することもできます。削除リンクをクリックすると、ユーザーは指定されたファイルを削除できます。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$_GET</span></span><span>[</span><span><span class="hljs-string">'delete'</span></span><span>])) {
</span><span><span class="hljs-variable">$fileToDelete</span></span><span> = </span><span><span class="hljs-variable">$uploadDir</span></span><span> . </span><span><span class="hljs-variable">$_GET</span></span><span>[</span><span><span class="hljs-string">'delete'</span></span><span>];
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">file_exists</span></span><span>(</span><span><span class="hljs-variable">$fileToDelete</span></span><span>)) {
</span><span><span class="hljs-title function_ invoke__">unlink</span></span><span>(</span><span><span class="hljs-variable">$fileToDelete</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"削除されたファイル: "</span></span><span> . </span><span><span class="hljs-variable">$_GET</span></span><span>[</span><span><span class="hljs-string">'delete'</span></span><span>];
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ファイルは存在しません!"</span></span><span>;
}
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
ファイルリストでは、各ファイルの削除リンクを提供すると、クリック後に削除操作がトリガーされます。 Unlink()関数は、ファイルを削除するために使用されます。
ファイルの名前変更は、ファイル管理システムでも一般的な操作です。ファイルの名前の名前を提供できます。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$_POST</span></span><span>[</span><span><span class="hljs-string">'rename'</span></span><span>]) && </span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$_POST</span></span><span>[</span><span><span class="hljs-string">'new_name'</span></span><span>])) {
</span><span><span class="hljs-variable">$oldFile</span></span><span> = </span><span><span class="hljs-variable">$uploadDir</span></span><span> . </span><span><span class="hljs-variable">$_POST</span></span><span>[</span><span><span class="hljs-string">'rename'</span></span><span>];
</span><span><span class="hljs-variable">$newFile</span></span><span> = </span><span><span class="hljs-variable">$uploadDir</span></span><span> . </span><span><span class="hljs-variable">$_POST</span></span><span>[</span><span><span class="hljs-string">'new_name'</span></span><span>];
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">rename</span></span><span>(</span><span><span class="hljs-variable">$oldFile</span></span><span>, </span><span><span class="hljs-variable">$newFile</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ファイルの名前を正常に変更します!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"名前変更に失敗しました!"</span></span><span>;
}
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
フォームを送信することにより、ユーザーはファイルの新しいファイル名を指定できます。 rename()関数は、古い名前から新しい名前にファイルを変更します。
move_uploaded_file()関数を組み合わせることにより、PHPはシンプルで実用的なファイル管理システムを実装できます。このシステムは、ファイルのアップロードをサポートするだけでなく、ファイルリスト、削除、名前変更などの一般的な操作も提供します。ファイル管理システムを実装する場合、ターゲットフォルダーの権限が正しく設定され、ファイルサイズ、タイプなどが適切に検証されて、システムのセキュリティと安定性が向上することを確認する必要があります。
上記の手順を通じて、基本的なファイルのアップロードおよび管理システムをすばやく構築し、ニーズに応じてさらに機能をさらに拡張できます。