たった5分でPHPのファイルアップロードを作る方法
業務系からコンシューマ向けサービスまで、あらゆるところでファイルのアップロードがあるこのご時世。
毎回、イチからファイルのアップロードを作るのは手間ですよね?
今回はそんな手間なファイルアップロードを一瞬で作ってしまう class.upload.php をご紹介します。
◆class.upload.phpに関するリンク
目次
環境
実行環境はこんな感じです。
CentOS 7
PHP Version 7.1.11
Composer
※Composerのインストールおよび使い方の説明は割愛します
※Linuxの使い方の説明は割愛します
※記事記載時点での最新バージョン 2.0.2 で説明していきます
実装方法
インストール
まずは composer で class.upload.php をインストールします
1 2 3 |
$ composer require verot/class.upload.php |
続いて class.upload.php を使用できるようにします
1 2 3 4 5 6 |
require 'vendor/autoload.php'; // Upload use \Verot\Upload\Upload; |
公式の解説では Namespace が \verot\Upload\Upload となっていますが、ライブラリの中身は \Verot\Upload\Upload となっているため、ダウンロードされたライブラリに合わせてあります。
さらに ファイルをアップロードするHTMLも作りましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> </head> <body> <form action="upload3.php" method="post" enctype="multipart/form-data"> <input type="file" name="upload_file" value="" /> <input type="submit" name="submit" value="送信" /> </form> </body> </html> |
これで class.upload.php を使用する準備ができました。
ファイルをアップロードする
ファイルをアップロードするには下記のような感じになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php require_once 'vendor/autoload.php'; use \Verot\Upload\Upload; $file = $_FILES['upload_file']; $lang = 'ja_JP'; // アップロードされたファイル配列を渡す // ※第2引数はエラーメッセージなどの言語設定 $handle = new Upload($file, $lang); // $fileのチェック if($handle->uploaded) { // アップロードディレクトリを指定して保存 $handle->process('./img/'); if($handle->processed) { // アップロード成功 } else { // アップロード処理失敗 echo $handle->error; } } else { // アップロード失敗 echo $handle->error; } |
たったこれだけでファイルのMimeTypeチェックからディレクトリの作成、アップロードまでが出来ちゃいます。
画像ファイル以外にExcelやPDFなどももちろんアップロード可能です。
画像ファイルをリサイズして保存する
画像ファイルを縮小して保存することはよくあると思います。
そんな時は下記のような感じになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?php require_once 'vendor/autoload.php'; use \Verot\Upload\Upload; $file = $_FILES['upload_file']; $lang = 'ja_JP'; // アップロードされたファイル配列を渡す // ※第2引数はエラーメッセージなどの言語設定 $handle = new Upload($file, $lang); // $fileのチェック if($handle->uploaded) { // リサイズする: 縦の比率を維持したまま、横幅を100にする $handle->image_resize = true; $handle->image_x = 100; $handle->image_ratio = true; // アップロードディレクトリを指定して保存 $handle->process('./img/'); if($handle->processed) { // アップロード成功 } else { // アップロード処理失敗 echo $handle->error; } } else { // アップロード失敗 echo $handle->error; } |
アスペクト比率を維持したまま縮小という、よくある処理も計算をすることなく一瞬でできます。
画像ファイルを別の形式に変換して保存する
jpegをpngに変換して保存、なんていうことも下記のような感じですぐに実装できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php require_once 'vendor/autoload.php'; use \Verot\Upload\Upload; $file = $_FILES['upload_file']; $lang = 'ja_JP'; // アップロードされたファイル配列を渡す // ※第2引数はエラーメッセージなどの言語設定 $handle = new Upload($file, $lang); // $fileのチェック if($handle->uploaded) { // pngに変換する // 指定可能パラメータ: png, webp, jpeg, gif, bmp $handle->image_convert = 'png'; // アップロードディレクトリを指定して保存 $handle->process('./img/'); if($handle->processed) { // アップロード成功 } else { // アップロード処理失敗 echo $handle->error; } } else { // アップロード失敗 echo $handle->error; } |
変換処理もこの通り、たった1行でできます。
もちろん、前述の リサイズ も合わせ技で行うことが可能です。
ファイル名を指定して上書きする
アップロードするファイル名を変更し、さらに同名のファイルがある場合は上書きするためには下記のような感じになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php require_once 'vendor/autoload.php'; use \Verot\Upload\Upload; $file = $_FILES['upload_file']; $lang = 'ja_JP'; // アップロードされたファイル配列を渡す // ※第2引数はエラーメッセージなどの言語設定 $handle = new Upload($file, $lang); // $fileのチェック if($handle->uploaded) { // ファイル名を変更する $handle->file_new_name_body = '新しい名前'; // 既にファイルが存在する場合は上書きする $handle->file_overwrite = true; // アップロードディレクトリを指定して保存 $handle->process('./img/'); if($handle->processed) { // アップロード成功 } else { // アップロード処理失敗 echo $handle->error; } } else { // アップロード失敗 echo $handle->error; } |
デフォルトでは上書きがOFFになっています。
上書き設定をONにしない場合、ファイル名に連番が振られていきます。
アップロードするファイルのMimeTypeを制限する
アップロードを可能とするファイルの種類を制限したい場合があると思います。
そんな時は下記のような感じになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<?php require_once 'vendor/autoload.php'; use \Verot\Upload\Upload; $file = $_FILES['upload_file']; $lang = 'ja_JP'; // アップロードされたファイル配列を渡す // ※第2引数はエラーメッセージなどの言語設定 $handle = new Upload($file, $lang); // $fileのチェック if($handle->uploaded) { // pngのみアップロードを可能にする $handle->allowed = [ 'image/png', ]; // アップロードを禁止するファイルタイプを指定 $handle->forbidden = [ 'application/*', ]; // アップロードディレクトリを指定して保存 $handle->process('./img/'); if($handle->processed) { // アップロード成功 } else { // アップロード処理失敗 echo $handle->error; } } else { // アップロード失敗 echo $handle->error; } |
許可・拒否の両方で ワイルドカードの「*」 が使用できます。
また、追加したい場合は array_merge を使うことで簡単に追加できます。
さらにこのライブラリでは Base64文字列やローカルファイルを処理 したり、 画像を圧縮 したり、 画像の切り抜き・背景色の指定 など、様々なことができます。
Composerが使えない・使わない場合
もし環境によりComposerが使えない場合やWindowsで使用する場合など、別の方法でインストールしたい時はこちらの記事をご参照ください。
PhpSpreadsheetを例に挙げた、Composerを使わずに使用する方法を記載しています。
さいご
業務などでも使う機能を中心とした、基本的な機能をご紹介しました。
感想としては、導入コストが低く、少ない記述で十分な機能を提供できていると思います。
PHPのファイルアップロードを実装する前に、一度導入の検討をしてみてはいかがでしょうか?
- おすすめ記事
POPULAR
のえる
Full-stack Developer