FuelPHPのUploadクラスの使い方

PHP

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

 

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

test.php

<?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;

&nbsp;

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

&nbsp;

今回の一番のポイントとしては、Upload::is_valid()を実行してしまうと「ファイルアップロードが必須となる」と言う点です。

&nbsp;

ファイルアップロードの必須を回避するための処理が、下記の部分の実装となります。
&#91;php&#93;
  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;

&nbsp;

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

ちなみに「Upload::UPLOAD_ERR_NO_FILE」は、PHPのUPLOAD_ERR_NO_FILEと同一のものとなっています。(値としては'4')

&nbsp;

さらに、下記のFuelPHPのUploadクラスを見ていくと。。。

<strong>/fuel/vendor/fuelphp/upload/src/FuelPHP/Upload/Upload.php</strong>
[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'    => null,
		'moveCallback'    => null,
		// validation settings
		'max_size'        => 0,
		'max_length'      => 0,
		'ext_whitelist'   => array(),
		'ext_blacklist'   => array(),
		'type_whitelist'  => array(),
		'type_blacklist'  => array(),
		'mime_whitelist'  => array(),
		'mime_blacklist'  => array(),
		// file settings
		'prefix'          => '',
		'suffix'          => '',
		'extension'       => '',
		'randomize'       => false,
		'normalize'       => false,
		'normalize_separator' => '_',
		'change_case'     => false,
		// save-to-disk settings
		'path'            => '',
		'create_path'     => true,
		'path_chmod'      => 0777,
		'file_chmod'      => 0666,
		'auto_rename'     => true,
		'overwrite'       => false,
	);

 

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

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

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

コメント

タイトルとURLをコピーしました