FuelPHPのUploadクラスの使い方

FuelPHPのUploadクラスの使い方

FuelPHPのUploadクラスの使い方をまとめてみました。
ちょっとクセがある感じなので、自分の使い方が正しいのかは不明です。

まずは、簡単にUpload処理を行うために下記のようなcontrollerを用意します。

アップロード処理のサンプル

<!--?php

class Controller_Test extends Controller
{
  public function action_upload() {
    Upload::process($conf);

    if (Upload::is_valid()) {
      $data = Upload::get_files(0);
      File::rename($data&#91;'file'&#93;, '保存先パス');
    } else {
      foreach (Upload::get_errors() as $error) {
        if ($error&#91;'errors'&#93;&#91;0&#93;&#91;'error'&#93; != Upload::UPLOAD_ERR_NO_FILE) {
          Session::set_flash('error', $error&#91;'errors'&#93;&#91;0&#93;&#91;'message'&#93;);
        }
      }
    }
  }
}
&#91;/php&#93;
<!-- /wp:shortcode -->

<!-- wp:paragraph -->
<p>アップロードの処理部分だけを書いているため、ファイルを選択する画面などは状況に合わせて変えて下さい。   </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>今回の一番のポイントとしては、Upload::is_valid()を実行してしまうと「ファイルアップロードが必須となる」と言う点です。   ファイルアップロードの必須を回避するための処理が、下記の部分の実装となります。 </p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>ファイルの必須を回避</h2>
<!-- /wp:heading -->

<!-- wp:shortcode -->
[php]
foreach (Upload::get_errors() as $error) {
if ($error['errors'][0]['error'] != Upload::UPLOAD_ERR_NO_FILE) {
Session::set_flash('error', $error['errors'][0]['message']);
}
}

最初はまさか・・・と思いましたが、英語をよく読んでみるとUpload::get_errors()で取り出したエラーコードが、「Upload::UPLOAD_ERR_NO_FILE」の場合の処理を入れる必要があると言うことがわかりました。

ちなみに「Upload::UPLOAD_ERR_NO_FILE」は、PHPのUPLOAD_ERR_NO_FILEと同一のものとなっています。(値としては’4’)   さらに、下記のFuelPHPのUploadクラスを見ていくと。。。

/fuel/vendor/fuelphp/upload/src/FuelPHP/Upload/Upload.php

<!--?php
/**
 * Part of the Fuel framework.
 *
 * @package    FuelPHP
 * @version    2.0
 * @author     Fuel Development Team
 * @license    MIT License
 * @copyright  2010 - 2013 Fuel Development Team
 * @link       http://fuelphp.com
 */

namespace FuelPHP\Upload;

/**
 * Upload is a container for unified access to uploaded files
 */
class Upload implements \ArrayAccess, \Iterator, \Countable
{
	/**
	 * @var  array  Container for uploaded file objects
	 */
	protected $container = array();

	/**
	 * @var  int  index pointer for Iterator
	 */
	protected $index = 0;

	/**
	 * @var  array  Default configuration values
	 */
	protected $defaults = array(
		// global settings
		'auto_process'    =--> false,
'langCallback' =&gt; null,
'moveCallback' =&gt; null,
// validation settings
'max_size' =&gt; 0,
'max_length' =&gt; 0,
'ext_whitelist' =&gt; array(),
'ext_blacklist' =&gt; array(),
'type_whitelist' =&gt; array(),
'type_blacklist' =&gt; array(),
'mime_whitelist' =&gt; array(),
'mime_blacklist' =&gt; array(),
// file settings
'prefix' =&gt; '',
'suffix' =&gt; '',
'extension' =&gt; '',
'randomize' =&gt; false,
'normalize' =&gt; false,
'normalize_separator' =&gt; '_',
'change_case' =&gt; false,
// save-to-disk settings
'path' =&gt; '',
'create_path' =&gt; true,
'path_chmod' =&gt; 0777,
'file_chmod' =&gt; 0666,
'auto_rename' =&gt; true,
'overwrite' =&gt; false,
);

composerでバージョンを上げると、今まであった「new_name」のプロパティがなくなっており、アップロードした際のファイル名の変更がUploadクラスだけでは完結できなくなっていると思われます。

そのため、ここではFuelPHPのFileクラスを利用しアップロードされた一時ファイルに対しFile::rename()を利用し、ファイル名を変えつつリネーム(コピー)する処理でごまかしています。

総括

これが正しい処理か?と言われると自信がありませんが、やりかたの1例としてあげておきます。

FuelPHPカテゴリの最新記事