42
FuelPHPでの ファイルアップロード 2012/09/23 @FuelPHP 勉強会 東京 Vol.2 kenjis

FuelPHPでのファイルアップロード

  • Upload
    kenjis

  • View
    9.626

  • Download
    2

Embed Size (px)

DESCRIPTION

FuelPHP 勉強会 東京 vol.2 発表資料

Citation preview

Page 1: FuelPHPでのファイルアップロード

FuelPHPでのファイルアップロード

2012/09/23@FuelPHP 勉強会 東京 Vol.2

kenjis

Page 2: FuelPHPでのファイルアップロード

セッションコンセプト

Page 3: FuelPHPでのファイルアップロード

セッションコンセプト

できれば、ノークレームでお願いします

Page 4: FuelPHPでのファイルアップロード

セッションコンセプト

できれば、ノークレームでお願いします

無理なら、その都度、穏やかに表現し溜め込まないでください

Page 5: FuelPHPでのファイルアップロード

セッションコンセプト

できれば、ノークレームでお願いします

無理なら、その都度、穏やかに表現し溜め込まないでください

発表内容にご不満がある場合は、ご自分ですごい内容の発表をお願いします

Page 6: FuelPHPでのファイルアップロード

セッションコンセプト

できれば、ノークレームでお願いします

無理なら、その都度、穏やかに表現し溜め込まないでください

発表内容にご不満がある場合は、ご自分ですごい内容の発表をお願いします

スタッフの対応にご不満がある場合は、ご自分がスタッフをして改善してください

Page 7: FuelPHPでのファイルアップロード

自己紹介

kenjis

「はじめてのフレームワークとしてのFuelPHP」(達人出版会)著者

2012年7月現在、日本に5人しかいない「PHP5技術者認定上級試験」の認定者の1人

Page 8: FuelPHPでのファイルアップロード

PHP技術者認定機構

http://www.phpexam.jp/

Page 9: FuelPHPでのファイルアップロード

Uploadクラス

FuelPHPにはアップロードを処理するUploadクラスがある

ドキュメント http://press.nekoget.com/fuelphp_doc/classes/upload/config.html

割と柔軟な感じ

Page 10: FuelPHPでのファイルアップロード

Uploadクラスの使い方

1.設定

2.アップロード処理

3.バリデーションの追加方法

Page 11: FuelPHPでのファイルアップロード

Uploadクラスの設定

設定ファイルでの設定

➔config/upload.php

使い方

➔core/config/upload.phpをapp/config/にコピーして変更する

➔app/config/upload.phpの設定値で上書きされる

Page 12: FuelPHPでのファイルアップロード

Uploadクラスの設定

変数での設定

➔Upload::process()に配列で設定を渡す

使い方$config = array(

'path' => DOCROOT . 'uploads/', // 保存先フォルダ'ext_whitelist' => array('gif', 'jpg', 'png'), // 許可する拡張子'max_size' => 100 * 1024, // 最大サイズ(100KB)

);

Upload::process($config);

Page 13: FuelPHPでのファイルアップロード

主要な設定項目

max_size

➔ファイルの最大サイズ

ext_whitelist

➔拡張子のホワイトリスト

path

➔ファイルの保存先

Page 14: FuelPHPでのファイルアップロード

その他の設定項目

type_whitelist

➔MIMEのタイプのホワイトリスト(type/subtypeのtypeの部分)

mime_whitelist

➔MIMEタイプのホワイトリスト

詳細は、公式ドキュメント参照

Page 15: FuelPHPでのファイルアップロード

アップロード処理の流れ// アップロード処理Upload::process($config);

// 検証if (Upload::is_valid()){

// ファイルの保存など}

foreach (Upload::get_errors() as $file){

// エラーファイルの処理}

foreach (Upload::get_files() as $file){

// 成功したファイルの処理}

Page 16: FuelPHPでのファイルアップロード

バリデーションの追加方法

イベントが使える

Upload::register($event, $callback)

イベント名

➔validate … 検証時

➔before … ファイル移動の前

➔after … ファイル移動の後

Page 17: FuelPHPでのファイルアップロード

バリデーションの追加方法

画像の検証を追加する例Upload::register('validate', function (&$file) {

if ($file['error'] == Upload::UPLOAD_ERR_OK){

switch($file['extension']){

case 'jpg':case 'png':case 'gif':

// 画像の検証default:

}}

});

Page 18: FuelPHPでのファイルアップロード

Uploadクラスのサンプル https://github.com/kenjis/fuel-samples

デモ

➔ http://test.fuelphp1st.com/fuel-samples/upload

Page 19: FuelPHPでのファイルアップロード

Uploadクラスのバグ

サンプルを作ってるときにバグを発見

auto_rename

➔同じファイル名のファイルがアップされた場合、「_1」のようにファイル名を変更して上書きしない機能

➔デフォルトでtrue

Page 20: FuelPHPでのファイルアップロード

Uploadクラスのバグ

auto_renameのファイルチェック// check if the file already existsif (file_exists($path.implode('', $save_as))){

if ( (bool) static::$config['auto_rename']){

$counter = 0;do{

$save_as[3] = '_'.++$counter;}while (file_exists($path.implode('', $save_as)));

}else

...略...}

...略...if( ! @move_uploaded_file($file['file'], static::$files[$key]['saved_to'].static::$files[$key]['saved_as']) )

...略...

Page 21: FuelPHPでのファイルアップロード

Uploadクラスのバグ

auto_renameのファイルチェック

➔ファイルが存在するかチェック

➔存在すれば数字を足してまたチェックを繰り返す

➔その後、move_uploaded_file()でファイルを移動

➔同時に存在チェックが走れば、後で移動されたファイルで上書きされる

Page 22: FuelPHPでのファイルアップロード

Uploadクラスのバグ

ただし、実際に遭遇する可能性は低い

➔同じファイル名のファイルがガンガン同時にアップロードされる必要がある

➔想定しづらい

➔でも、気持ち悪い

Page 23: FuelPHPでのファイルアップロード

Uploadクラスのバグ

テストは書ける

Guzzleを使ったファンクショナルテスト$client = new \Guzzle\Http\Client(static::open('upload'));

$expected = 20; // 同時アクセス$array = array();for ($i = 0; $i < $expected; $i++){

$array[] = $client->post()->addPostFields(array('name' => 'file'))->addPostFiles(array(

'file' => APPPATH . 'tests/fixture/drops.png'));

}

$responses = $client->send($array);

Page 24: FuelPHPでのファイルアップロード

Uploadクラスのバグ

というわけで、Pull Request

➔ https://github.com/fuel/core/pull/1152

Page 25: FuelPHPでのファイルアップロード

Pull Requestしよう

バグを見つけたら、Pull Requestしましょう

Page 26: FuelPHPでのファイルアップロード

Pull Requestしよう

バグを見つけたら、Pull Requestしましょう

やりかたがわからない?

Page 27: FuelPHPでのファイルアップロード

Pull Requestしよう

バグを見つけたら、Pull Requestしましょう

やりかたがわからない?

『FuelPHPに貢献する方法』(無料)に書いてあります

➔ https://leanpub.com/how_to_contribute_fuelphp_ja

Page 28: FuelPHPでのファイルアップロード

『FuelPHPに貢献する方法』

https://leanpub.com/how_to_contribute_fuelphp_ja

Page 29: FuelPHPでのファイルアップロード

『FuelPHPに貢献する方法』

Page 30: FuelPHPでのファイルアップロード

『FuelPHPに貢献する方法』

Page 31: FuelPHPでのファイルアップロード

Uploadクラスの実例 https://github.com/kenjis/epub-converter

デモ

➔ http://test.fuelphp1st.com/epub-converter/

Page 32: FuelPHPでのファイルアップロード

Uploadクラスの実例 https://github.com/kenjis/epub-converter

EPUBファイルをアップロードしてKobo用に最適化=KOBO EPUB(kepub)の作成

➔ EPUBをアップロード

➔ EPUB=Zipファイルを展開

➔ 中のxhtmlなどを変更

➔ Zipアーカイブを作成=kepubの作成

➔ 作成したkepubをダウンロード

Page 33: FuelPHPでのファイルアップロード

最後に

Page 34: FuelPHPでのファイルアップロード

最後に

FuelPHPの日本語情報をもっと増やそう!

Page 35: FuelPHPでのファイルアップロード

最後に

ブログを書こう!

➔調べたこと、やったことを

➔公式ドキュメントにあることでもOK

➔詰まったことはブログやMLに

➔間違ったことをブログに書いても訂正してもらえるかも

ブログを書いたらtwitterでつぶやこう

Page 36: FuelPHPでのファイルアップロード

最後に

ソースを読もう

バグは報告やPull Requestしよう

一般性があれば、オレオレ化でなくPull Requestしてみよう

Page 37: FuelPHPでのファイルアップロード

最後に

イベントや勉強会で発表しよう!

➔FuelPHP勉強会

➔PHP勉強会

➔PHPカンファレンス

➔その他

勉強会をやってみよう!

Page 38: FuelPHPでのファイルアップロード

最後に

書籍を出版しよう!

Page 39: FuelPHPでのファイルアップロード

最後に

書籍を出版しよう!

Page 40: FuelPHPでのファイルアップロード

最後に

Page 41: FuelPHPでのファイルアップロード

最後に

情報が増えるとみんなが楽になる

FuelPHPはまだ始まったばかりです

Page 42: FuelPHPでのファイルアップロード

最後に

情報が増えるとみんなが楽になる

FuelPHPはまだ始まったばかりです

家に帰ってブログを書くまでが勉強会です