Written by Manabu Bannai

【CodeIgniter】ファイルアップロード、サムネイル生成をする方法

CodeIgniter PROGRAMMING

CodeIgniterでファイルのアップロードとサムネイル生成する方法をまとめです。

もくじ

それではまとめていきます。

CodeIgniterの初期設定

初期設定をする

.htaccessを作成
applicationを同階層に以下を設置

以下の部分に注意してください。
RewriteBase /file_uploading/ //フォルダ名に合わせて変更する


    RewriteEngine On
    RewriteBase /file_uploading/  //フォルダ名に合わせて変更する
 
    #Removes access to the system folder by users.
    #Additionally this will allow you to create a System.php controller,
    #previously this would not have been possible.
    #'system' can be replaced if you have renamed your system folder.
    RewriteCond %{REQUEST_URI} ^system.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]
 
    #When your application folder isn't in the system folder
    #This snippet prevents user access to the application folder
    #Submitted by: Fabdrol
    #Rename 'application' to your applications folder name.
    RewriteCond %{REQUEST_URI} ^application.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]
 
    #Checks to see if the user is attempting to access a valid file,
    #such as an image or css document, if this isn't true it sends the
    #request to index.php
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?/$1 [L]

 

    # If we don't have mod_rewrite installed, all 404's
    # can be sent to index.php, and everything works as normal.
    # Submitted by: ElliotHaughin
 
    ErrorDocument 404 /index.php
 

編集ファイル:config/config.php

$config['base_url']	= 'http://localhost/file_uploading';

$config['index_page'] = '';

編集ファイル:config/autoload.php

$autoload['helper'] = array("url", "form", "file");

ギャラリーのビューを作成していく

新規作成ファイル:views/gallery.php

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>ギャラリー</title>
</head>
<body>

<div id="gallery">
</div>

<div id="upload">
</div>

</body>
</html>

CodeIgniterでアップロードフォームを作成する

フォームを作成し、POST先を決める

編集ファイル:views/gallery.php

<div id="upload">
<?php
	// galleryに情報がPOSTされる
	echo form_open_multipart("gallery");
?>
</div>

次に、galleryのコントローラーを作っていきます。

galleryコントローラーを作成する

新規作成ファイル:controller/gallery.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Gallery extends CI_Controller {
	function index(){
		// galleryのビューを読み込む
		$this->load->view("gallery");
	}

}

ファイルアップロードクラスを使って、フォームをさらに作り込んでいく

編集ファイル:views/gallery.php

<div id="upload">
<?php
	// galleryに情報がPOSTされる
	echo form_open_multipart("gallery");

	// ファイルアップロードクラスを利用します。
	// デフォルトのファイルアップロード名は『userfile』なので、これを利用すると便利です。
	echo form_upload("userfile");

	echo form_submit("upload", "アップロード");
	echo form_close();
?>
</div>

ここまでで、以下のようなベーシックなフォームができあがります。
まだ、アップロードボタンは動作しません。
◆file_upload_basic

galleryコントローラーを作り込んでいく

編集ファイル:controller/gallery.php


class Gallery extends CI_Controller {
	function index(){

		// Gallery_modelはまだ未作成なので、これから作成していきます。
		$this->load->model("Gallery_model");

		// アップロード情報がPOSTされたかどうかで条件分岐
		if($this->input->post("upload")){

			// Gallery_modelのモデル内にあるdo_uploadメソッドはまだ未作成なので、これから作成していきます。
			$this->Gallery_model->do_upload();
		}

		// galleryのビューを読み込む
		$this->load->view("gallery");
	}

}

それでは、Gallery_modelを作成していきます。

Gallery_modelの作成

新規作成ファイル:model/gallery_model.php

まずはじめに、以下のようにライブラリを読み込みます。

<?php
class Gallery_model extends CI_Model{
	function do_upload(){
		// 第2引数で条件を受け取ることができます。
		$this->load->library("upload", $config);
		
		// アップロードライブラリの読み込み後は、以下のように実行します。
		$this->upload->do_upload();
	}
}

ファイルアップロードライブラリの第2引数の設定

第2引数の条件を以下のように記述します。

$config = array(
	// ファイルのアップロード制限
	"allowed_types"=>"jpg|jpeg|gif|png",

	// ファイルのアップロード先を決める
	"upload_path"=>$this->gallery_path
);

次に、ファイルアップロード先に指定した、gallery_pathを定義します。

// ファンクション内に記述しないこと
var $gallery_path;

次に、gallery_pathを取得するプログラムを作成します。

var $gallery_path;

function Gallery_model(){
	parent::__construct();

	// realpathとは
	// realpath() は、入力 path のシンボリックリンクをすべて展開し、正規化した絶対パスを返します。

	// APPPATHとは
	// CodeIgniterのApplicationフォルダの階層を指します
	$this->gallery_path = realpath(APPPATH. "../images");
}

以上で、ファイルアップロードの機能が完成しました。
ファイルアップロードをすると、imagesフォルダに格納されます。

最終的なコードは以下です。
完成コード:model/gallery_model.php

<?php
class Gallery_model extends CI_Model{

	var $gallery_path;

	function Gallery_model(){
		parent::__construct();

		// realpathとは
		// realpath() は、入力 path のシンボリックリンクをすべて展開し、正規化した絶対パスを返します。

		// APPPATHとは
		// CodeIgniterのApplicationフォルダの階層を指します
		$this->gallery_path = realpath(APPPATH. "../images");
	}

	function do_upload(){
		$config = array(
			// ファイルのアップロード制限
			"allowed_types"=>"jpg|jpeg|gif|png",

			// ファイルのアップロード先を決める
			"upload_path"=>$this->gallery_path
		);

		// 第2引数で条件を受け取ることができます。
		$this->load->library("upload", $config);
		$this->upload->do_upload();
	}

}

※参考1
その他のconfigオプションを設定したい場合は、CodeIgniterマニュアルの『設定項目』をご確認ください。
ファイルアップロードクラス : CodeIgniter ユーザガイド 日本語版

※参考2
3MB以上の画像は受け付けたくない場合は以下のように記述します。

"max_size" => 3000

アップロードされた画像のサムネイルを生成する

imagesフォルダ内部にthumbsフォルダを作成する

次に、イメージライブラリを読み込みます。

編集ファイル:models/gallery_model.php

$config = array(
);

// イメージライブラリは次のように引数をとります。
// 引数はライブラリ読み込み前に定義しておきます。
$this->load->library("image_lib", $config);

アップロードライブラリからファイルのパスを取得する

編集ファイル:models/gallery_model.php


// アップロードライブラリを読み込み、$image_dataに格納
$image_data = $this->upload->data();

// アップロードライブラリで生成された$image_dataから、
// 以下のようにアップロードファイルのパスを取得できる
$config = array(
	"source_image"=> $image_data["full_path"]
);

$this->load->library("image_lib", $config);

その後、次のように$configに必要情報を追記していき、最後にリサイズのライブラリを読み込みます

$config = array(
	"source_image"=> $image_data["full_path"],
	"new_image" =>$this->gallery_path . "/thumbs",

	// リサイズされるときや、固定の値を指定したとき、もとの画像のアスペクト比を維持するかどうかを指定する
	"maintain_ration"=>true,
	"width"=>150,
	"height"=>100
);

$this->load->library("image_lib", $config);
$this->image_lib->resize();

アップロードライブラリはその他にもいろいろな引数をとります。
詳細はマニュアルからどうぞ。
画像操作クラス : CodeIgniter ユーザガイド 日本語版

この時点で、画像アップロードをするとサムネイルがフォルダ内に生成されるようになります。
完成コードは以下です。

function do_upload(){
	$config = array(
		// ファイルのアップロード制限
		"allowed_types"=>"jpg|jpeg|gif|png",

		// ファイルのアップロード先を決める
		"upload_path"=>$this->gallery_path,

		// 3MB以上の画像は受け付けない
		"max_size" => 3000
	);

	// 第2引数で条件を受け取ることができます。
	$this->load->library("upload", $config);
	$this->upload->do_upload();

	// アップロードライブラリを読み込み、$image_dataに格納
	$image_data = $this->upload->data();

	// アップロードライブラリで生成された$image_dataから、
	// 以下のようにアップロードファイルのパスを取得できる
	$config = array(
		"source_image"=> $image_data["full_path"],
		"new_image" =>$this->gallery_path . "/thumbs",

		// リサイズされるときや、固定の値を指定したとき、もとの画像のアスペクト比を維持するかどうかを指定する
		"maintain_ratio"=>true,
		"width"=>150,
		"height"=>100
	);

	// イメージライブラリは次のように引数をとります。
	// 引数はライブラリ読み込み前に定義しておきます。
	$this->load->library("image_lib", $config);
	$this->image_lib->resize();
}

アップロードされた画像をビューで読み込む

galleryコントローラーで画像取得の記述を追加する

編集ファイル:controllers/gallery.php

// get_imagesメソッドはまだ未完成なので、これから作っていきます
$data["images"] = $this->Gallery_model->get_images();
$this->load->view("gallery", $data);

get_imagesメソッドを作っていく

編集ファイル:models/gallery_model.php

// imagesフォルダのコンテンツを読み込む機能
function get_images(){

	// scandirでは、指定したパスのディレクトリの内容を配列で取得できる
	$files = scandir($this->gallery_path);

	// array_diffでは配列の差分を計算します
    //  次の項で利用する、if(isset($images) && count($images))の判定に利用します。
	$files=array_diff($files, array(".", "..", "thumbs"));

imagesの情報を取得する

編集ファイル:models/gallery_model.php

// まずはarrayを実行
$images = array();

// 実行済のarrayにforeachで値を挿入していく
foreach($files as $file){
	$images[]= array(
		// URLバージョンのギャラリーパスを利用
		"url" =>$this->gallery_path_url . $file,
		"thumb_url" =>$this->gallery_path_url."thumbs/".$file
	);
}
return $images;

gallery_path_urlを定義します。

class Gallery_model extends CI_Model{
	var $gallery_path;

	// URLバージョンのギャラリーパスを取得
	var $gallery_path_url;

	function Gallery_model(){
		parent::__construct();

		// realpathとは
		// realpath() は、入力 path のシンボリックリンクをすべて展開し、正規化した絶対パスを返します。

		// APPPATHとは
		// CodeIgniterのApplicationフォルダの階層を指します
		$this->gallery_path = realpath(APPPATH. "../images");

		$this->gallery_path_url = base_url(). "images/";
	}

※最終的なget_imagesファンクションのコードは以下となります。

function get_images(){

	// scandirでは、指定したパスのディレクトリの内容を配列で取得できる
	$files = scandir($this->gallery_path);

	// array_diffでは配列の差分を計算します
	$files=array_diff($files, array(".", "..", "thumbs"));

	// まずはarrayを実行
	$images = array();

	// 実行済のarrayにforeachで値を挿入していく
	foreach($files as $file){
		$images[]= array(

			// URLバージョンのギャラリーパスを利用
			"url" =>$this->gallery_path_url . $file,
			"thumb_url" =>$this->gallery_path_url."thumbs/".$file
		);
	}
	return $images;
}

ギャラリーを表示するビューをつくっていく

編集ファイル:views/gallery.php

<div id="gallery">

<?php	if(isset($images) && count($images)): >?
<?php endforeach; ?>
<?php else: ?>
	<div id="blank_gallery">画像をアップロードしてください</div>
<?php endif;?>

</div>

imagesフォルダを空にしてから、上記プログラムを実行すると
画像をアップロードしてくださいと表示されます。

それでは、画像がアップロードされたあとの処理をつくっていきます。

画像アップロード後にギャラリー表示するプログラムの作成

編集ファイル:views/gallery.php

<div id="gallery">
	<?php	if(isset($images) && count($images)):
	 // フォルダ内に画像がある場合は以下を実行 
		foreach($images as $image):
	?>
		<div class="tumbs">
			<a href="<?php echo $image["url"]; ?>">
				<img src="<?php echo $image["thumb_url"]; ?>">
			</a>
		</div>
	<?php endforeach; ?>

	<?php else: ?>
		<div id="blank_gallery">画像をアップロードしてください</div>
	<?php endif;?>

</div>

以上で完成です!
画像アップロード処理と画像加工機能をもったプログラムが完成しました。

コードはgithubに公開しています。
manabubannai/file_uploading

※P.S:無料メルマガで発信中:過去の僕は「ブログ発信で5億円」を稼ぎました。次は「30億円」を目指します。挑戦しつつ、裏側の思考を「メルマガ」から発信します。不満足なら1秒で解約できます。無料登録は「こちら」です。