CodeIgniterでファイルをアップロード!初心者向け保存方法の基本ガイド
生徒
「CodeIgniterを使って、ユーザーが選んだ写真や画像をサーバーに保存したいのですが、どうすればいいですか?」
先生
「CodeIgniterには、ファイルを安全にアップロードするための便利な仕組みが用意されています。まずはフォームを作るところから始めましょう。」
生徒
「難しそうに見えますが、初心者でも実装できますか?」
先生
「大丈夫ですよ!手順を一つずつ確認していけば、誰でもファイルを保存する仕組みを作ることができます。」
1. ファイルアップロードとは?基本をマスターしよう
Webサイトを使っていると、自分のプロフィール画像を設定したり、書類を提出したりする場面がありますよね。これをプログラミングの世界では「ファイルアップロード」と呼びます。私たちが普段使っているパソコンやスマートフォンの中にあるデータを、インターネット上のコンピュータ(サーバー)に送り届けて、決められた場所に保管する作業のことです。
PHPというプログラミング言語で作られた枠組み(フレームワーク)であるCodeIgniter(コードイグナイター)を使うと、この複雑な通信作業をとてもシンプルに記述できます。初心者が最初につまずきやすい「セキュリティ対策」や「保存先の指定」も、CodeIgniterが裏側で助けてくれるので安心してください。
まずは、家にある引き出しに物をしまう様子をイメージしてみましょう。引き出し(保存フォルダ)を用意し、何を入れるか決め、実際に入れてから鍵をかける。この一連の流れがプログラムでも行われます。
2. 準備するもの:HTMLフォームの作成
ファイルを送るためには、まずユーザーがファイルを選択するためのボタンが必要です。これはHTMLという言語で作成します。ここで最も重要なポイントは、formタグにenctype="multipart/form-data"という魔法の言葉を付け加えることです。これがないと、どんなに頑張ってもファイルは送られません。
この記述は、コンピュータに「今から送るのはテキスト(文字)だけじゃなくて、画像などのデータも含まれているよ!」と教えてあげるための合図です。初心者はここを忘れがちなので、しっかりメモしておきましょう。
<!-- ファイルを送るための専用フォーム -->
<form action="/upload/upload_file" method="post" enctype="multipart/form-data">
<input type="file" name="userfile" size="20" />
<br /><br />
<input type="submit" value="アップロード開始" />
</form>
3. サーバー側での受け取り設定(コントローラー)
次に、送られてきたファイルを受け取って、実際に保存する命令を書きます。CodeIgniter4ではIncomingRequestという機能を使ってファイルにアクセスします。コントローラーとは、プログラムにおける「司令塔」のような存在です。ユーザーから届いたボールを、どこに投げるかを決める役割を持っています。
ここでは、まずファイルが正しく届いているか、エラーが起きていないかを確認します。例えば、ネットの調子が悪くてファイルが壊れてしまった場合などに、無理に保存しようとするとエラーが発生してしまうからです。これをチェックすることをバリデーション(検証)と言います。
namespace App\Controllers;
use CodeIgniter\Controller;
class Upload extends Controller
{
public function upload_file()
{
// 1. 画面から送られてきたファイルを取得する
$file = $this->request->getFile('userfile');
// 2. ファイルが正常にアップロードされたかチェック
if (! $file->isValid()) {
throw new \RuntimeException($file->getErrorString().'('.$file->getError().')');
}
// 3. 保存先を指定して移動させる
$file->move(WRITEPATH . 'uploads');
echo 'ファイルの保存に成功しました!';
}
}
4. ファイルの保存場所「書き込み権限」とは?
プログラムがファイルを保存しようとしても、「その場所には勝手に入っちゃダメ!」とコンピュータに怒られてしまうことがあります。これが権限(パーミッション)の問題です。パソコンを触ったことがない方向けに説明すると、これは「入室許可証」のようなものです。
サーバーの中にある特定のフォルダに対して、「プログラムさんがファイルを置いていいですよ」という許可設定をしてあげる必要があります。一般的には、CodeIgniterのwritableという名前のフォルダがその役割を担っています。ここが正しく設定されていないと、プログラムが正しくても保存に失敗してしまいます。エラーが出たときは、まず「鍵が開いているか」を確認しましょう。
5. アップロードされたファイルの情報を確認する
ファイルを保存した後は、そのファイルがどんな名前で、どれくらいの大きさなのかを知りたくなりますよね。CodeIgniterなら、保存した後の情報を簡単に取得できます。例えば、ユーザーがアップロードした元のファイル名ではなく、システムが勝手に付けた「ランダムな名前」に変更して保存することもできます。これは、同じ名前のファイルが重なって消えてしまうのを防ぐためにとても有効な手段です。
下記のコードでは、保存したファイルの名前を表示する方法を紹介します。これを応用すれば、データベースという「情報の保管庫」にファイル名を記録して、後から画面に表示させることができるようになります。
public function get_info()
{
$file = $this->request->getFile('userfile');
if ($file->isValid() && ! $file->hasMoved()) {
// ランダムな名前を作って保存する
$newName = $file->getRandomName();
$file->move(WRITEPATH . 'uploads', $newName);
// 結果を表示
echo "新しいファイル名: " . $newName . "<br>";
echo "元のファイル名: " . $file->getClientName() . "<br>";
echo "ファイルのサイズ: " . $file->getSize('mb') . " MB";
}
}
新しいファイル名: 1704682931_a1b2c3d4e5f6.jpg
元のファイル名: profile_picture.jpg
ファイルのサイズ: 1.2 MB
6. 画像だけを許可する!安全な制限のかけ方
何でもかんでもアップロードできてしまうと、悪いプログラム(ウイルスなど)を送り込まれる危険があります。そのため、「画像ファイルだけ」「PDFだけ」といった具合に、種類を制限することが非常に大切です。これをMIMEタイプ(マイムタイプ)のチェックと呼びます。
CodeIgniterでは、isValid()の他にも、拡張子やファイルの種類を判別する機能が備わっています。初心者のうちは、まず「画像かどうか」を判定するコードを書いてみましょう。これで、プログラムの安全性がぐっと高まります。
public function check_image()
{
$file = $this->request->getFile('userfile');
// 画像ファイル(jpg, png)かどうかを確認する
if (! $file->getClientMimeType() === 'image/jpeg' && ! $file->getClientMimeType() === 'image/png') {
echo "エラー:画像ファイルのみアップロード可能です。";
return;
}
$file->move(WRITEPATH . 'uploads/images');
echo "画像として保存しました。";
}
7. ファイルサイズを制限してサーバーを守る
大きなサイズのファイルをたくさん送られると、サーバーの容量がいっぱいになってパンクしてしまいます。そうならないために、「1MB(メガバイト)以上のファイルは受け取らない」といったルールを作ります。1MBは、大体高画質な写真1枚分くらいの重さだと考えてください。
CodeIgniterのバリデーション機能を使えば、「大きさ」「形式」「縦横のサイズ」などを一括でチェックできます。これは、お店の入り口にある「持ち物検査」のようなものです。厳しい検査を通り抜けたファイルだけが、大切に保存される仕組みを作ることが、プロのプログラマーへの第一歩です。
8. 保存されたファイルをブラウザで見せる方法
ファイルを保存しただけでは、ユーザーはその中身を見ることができません。なぜなら、CodeIgniterのwritableフォルダは、セキュリティのために外部からは見えない隠し部屋になっているからです。保存した画像をプロフィール画面などで表示するには、プログラムを介して「画像を出力する」という特別な命令を出すか、一般公開用のフォルダ(publicフォルダ)に保存する必要があります。
例えば、一般公開用の場所に保存する場合は、ROOTPATH . 'public/uploads'といった指定を使います。これで、誰でもその画像を見ることができるようになります。用途に合わせて「隠す場所」に保存するか「見せる場所」に保存するかを使い分けるのがコツです。最初は難しいかもしれませんが、まずは「保存できた!」という成功体験を積み重ねていきましょう。