ファイルのアップロードとダウンロード

PHPのファイル処理における「ファイルのアップロードとダウンロード」は、Webアプリケーションで頻繁に使われる重要な機能です。以下に、それぞれについて詳しく解説します。


1. ファイルのアップロード

ファイルのアップロードは、ユーザーがフォームを使って自分のローカルファイルをWebサーバーに送信する機能です。PHPでは、$_FILES スーパーグローバル変数を使用して処理します。

フォーム側のHTML

html
<form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="uploaded_file"> <input type="submit" value="アップロード"> </form>
  • enctype="multipart/form-data" は、ファイルを送信するために必須です。

PHP側の処理例(upload.php)

php
<?php $target_dir = "uploads/"; $target_file = $target_dir . basename($_FILES["uploaded_file"]["name"]); if (move_uploaded_file($_FILES["uploaded_file"]["tmp_name"], $target_file)) { echo "ファイル ". htmlspecialchars(basename($_FILES["uploaded_file"]["name"])) . " がアップロードされました。"; } else { echo "ファイルのアップロード中にエラーが発生しました。"; } ?>

主なポイント

  • $_FILES['uploaded_file']['name']: 元のファイル名

  • $_FILES['uploaded_file']['tmp_name']: 一時保存先のパス

  • move_uploaded_file(): 一時ファイルを任意のディレクトリへ移動する関数(これが実質的なアップロード処理)


2. ファイルのダウンロード

ファイルのダウンロードは、サーバー上のファイルをユーザーがダウンロードできるようにする処理です。header() 関数を使ってHTTPヘッダーを適切に設定し、ファイルを出力します。

PHPによるダウンロードスクリプト例

php
<?php $file = 'uploads/sample.pdf'; if (file_exists($file)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'. basename($file) .'"'); header('Content-Length: ' . filesize($file)); readfile($file); exit; } else { echo "ファイルが見つかりません。"; } ?>

主なポイント

  • Content-Type: ブラウザにバイナリファイルであることを示す

  • Content-Disposition: attachment: ダウンロード用であることを明示する

  • readfile(): ファイルの中身を読み込んで出力する


セキュリティ上の注意点

  • アップロードされたファイルの拡張子・MIMEタイプをチェックする

  • ファイル名をリネームして保存する(予期せぬ上書きやパス操作を防ぐ)

  • ダウンロード時にユーザーが指定したファイルをそのまま使わず、事前に存在確認やパスチェックを行う

生成日:2025/05/03