Web サイト開発では、ファイルのアップロードとダウンロードは非常に一般的な機能です。写真、ドキュメント、圧縮パッケージのいずれであっても、多くの Web サイトにはアップロードとダウンロードのための入り口が用意されています。この記事では、PHP を使用して、HTML フォーム、アップロード ロジック、ダウンロード スクリプトなどの単純なファイルのアップロードおよびダウンロード関数を作成する方法を詳しく紹介します。
まず、ユーザーがファイルを選択してアップロードするためのフォームをページ上に作成する必要があります。
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="アップロード">
</form>上記のコードでは次のようになります。
次に、 upload.phpファイルにバックエンド ロジックを記述します。
<?php
$targetDir = "uploads/"; // アップロード文件的存储目录
$targetFile = $targetDir . basename($_FILES["file"]["name"]); // アップロード后的文件路径
// ファイルの種類を確認する
$fileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));
$allowedTypes = array("jpg", "jpeg", "png", "gif");
if (!in_array($fileType, $allowedTypes)) {
echo "只允许アップロード图片文件!";
exit;
}
// 指定したディレクトリにファイルを移動する
if (move_uploaded_file($_FILES["file"]["tmp_name"], $targetFile)) {
echo "文件アップロード成功!";
} else {
echo "文件アップロード失败!";
}
?>上記のコードは、move_uploaded_file()関数を通じて一時ファイルをターゲット フォルダーに移動し、アップロードする前にファイル タイプのセキュリティ チェックを実行します。実際の開発では、ファイルサイズの検証やランダムなファイル名変更など、セキュリティをさらに高めることができます。
ファイルがアップロードされると、ダウンロード可能なファイルのリストがページに表示されます。例えば:
<?php
$files = glob("uploads/*"); // 得るuploadsディレクトリ内のすべてのファイル
foreach ($files as $file) {
$fileName = basename($file);
echo "<a href='download.php?file={$fileName}'>{$fileName}</a><br>";
}
?>上記のコードは、 glob()関数を使用してアップロードディレクトリをスキャンし、ファイルごとにクリック可能なダウンロード ハイパーリンクを生成します。
次に、ダウンロード処理ロジックをdownload.phpファイルに記述します。
<?php
$fileName = $_GET["file"];
$filePath = "uploads/" . $fileName;
if (file_exists($filePath)) {
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename={$fileName}");
readfile($filePath);
} else {
echo "ファイルが存在しません!";
}
?>スクリプトは、 file_exists()を通じてファイルが存在するかどうかを確認し、ブラウザーがダウンロードをトリガーできるように応答ヘッダーを設定します。セキュリティの問題を防ぐために、運用環境にファイル名のフィルタリングと権限の検証を追加することをお勧めします。
この記事の例を通じて、PHP でファイルのアップロードおよびダウンロード機能を実装する基本的な方法をすぐにマスターできます。この例は比較的基本的なものですが、初心者がファイル処理のプロセスを理解するのに非常に適しています。実際のプロジェクトでは、これに基づいてファイル サイズ制限の拡大、ログ レコードのアップロード、権限制御などを拡張して、セキュリティと安定性を向上させることができます。