0 フォロワー

クラス yii\web\MultipartFormDataParser

継承yii\web\MultipartFormDataParser » yii\base\BaseObject
実装yii\base\Configurable, yii\web\RequestParserInterface
利用可能なバージョン2.0.10
ソースコード https://github.com/yiisoft/yii2/blob/master/framework/web/MultipartFormDataParser.php

MultipartFormDataParser は、'multipart/form-data' としてエンコードされたコンテンツを解析します。

このパーサーは、例えば 'PUT' リクエストメソッドを持つものなど、非 POST リクエストにおける 'multipart/form-data' 処理のフォールバックを提供します。

このパーサーを有効にするには、yii\web\Request::$parsers を次のように構成する必要があります。

return [
    'components' => [
        'request' => [
            'parsers' => [
                'multipart/form-data' => 'yii\web\MultipartFormDataParser'
            ],
        ],
        // ...
    ],
    // ...
];

このパーサーの parse() メソッドは、生のボディから解析されたファイルで $_FILES を自動的に設定します。

注意: これはリクエストパーサーであるため、yii\web\Request::getBodyParams()$_FILES の値を初期化します。このメソッドが呼び出されるまで、リクエストボディに送信されたファイルがあったとしても、$_FILES 配列は空のままになります。このパーサーを使用する場合は、アップロードされたファイルを取得する前に、必ずボディパラメータをリクエストしてください。

使用例

use yii\web\UploadedFile;

$restRequestData = Yii::$app->request->getBodyParams();
$uploadedFile = UploadedFile::getInstancesByName('photo');

$model = new Item();
$model->populate($restRequestData);
copy($uploadedFile->tempName, '/path/to/file/storage/photo.jpg');

注意: このパーサーは $_FILES の通常の構造を完全にエミュレートしますが、tmp_name キーを介して利用可能な関連する一時ファイルは、PHP によってアップロードされたものとして認識されません。したがって、is_uploaded_file()move_uploaded_file() のような関数はそれらに対して失敗します。

公開プロパティ

継承されたプロパティを非表示

プロパティ 説明 定義元
$force boolean 'POST' リクエストと $_FILES がすでに設定されている場合でも、生のボディを解析するかどうか。 yii\web\MultipartFormDataParser
$uploadFileMaxCount integer アップロード可能なファイルの最大数。 yii\web\MultipartFormDataParser
$uploadFileMaxSize integer アップロード可能なファイルの最大サイズ(バイト単位)。 yii\web\MultipartFormDataParser

公開メソッド

継承されたメソッドを非表示

メソッド 説明 定義元
__call() クラスメソッドではない名前付きメソッドを呼び出します。 yii\base\BaseObject
__construct() コンストラクタ。 yii\base\BaseObject
__get() オブジェクトプロパティの値を返します。 yii\base\BaseObject
__isset() プロパティが設定されているか(つまり、定義されており、nullでないか)を確認します。 yii\base\BaseObject
__set() オブジェクトプロパティの値を設定します。 yii\base\BaseObject
__unset() オブジェクトプロパティを null に設定します。 yii\base\BaseObject
canGetProperty() プロパティが読み取り可能かどうかを示す値を返します。 yii\base\BaseObject
canSetProperty() プロパティが設定可能かどうかを示す値を返します。 yii\base\BaseObject
className() このクラスの完全修飾名を返します。 yii\base\BaseObject
getUploadFileMaxCount() yii\web\MultipartFormDataParser
getUploadFileMaxSize() yii\web\MultipartFormDataParser
hasMethod() メソッドが定義されているかどうかを示す値を返します。 yii\base\BaseObject
hasProperty() プロパティが定義されているかどうかを示す値を返します。 yii\base\BaseObject
init() オブジェクトを初期化します。 yii\base\BaseObject
parse() HTTP リクエストボディを解析します。 yii\web\MultipartFormDataParser
setUploadFileMaxCount() yii\web\MultipartFormDataParser
setUploadFileMaxSize() yii\web\MultipartFormDataParser

プロパティの詳細

継承されたプロパティを非表示

$force 公開プロパティ (バージョン 2.0.13 以降で利用可能)

'POST' リクエストと $_FILES がすでに設定されている場合でも、生のボディを解析するかどうか。デフォルトでは、このオプションは無効になっており、PHPによって自動的に処理される 'POST' リクエストのパフォーマンスを節約します。 > 注意: このオプションが有効になっている場合、$_FILES の値は解析ごとにリセットされます。

public boolean $force false
$uploadFileMaxCount 公開プロパティ

アップロード可能なファイルの最大数。

$uploadFileMaxSize 公開プロパティ

アップロード可能なファイルの最大サイズ(バイト単位)。

メソッドの詳細

継承されたメソッドを非表示

__call() public メソッド

定義元: yii\base\BaseObject::__call()

クラスメソッドではない名前付きメソッドを呼び出します。

未知のメソッドが呼び出されたときに暗黙的に呼び出されるPHPのマジックメソッドであるため、このメソッドを直接呼び出さないでください。

public mixed __call ( $name, $params )
$name string

メソッド名

$params array

メソッドのパラメータ

return mixed

メソッドの戻り値

throws yii\base\UnknownMethodException

未知のメソッドを呼び出すとき

                public function __call($name, $params)
{
    throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}

            
__construct() public メソッド

定義元: yii\base\BaseObject::__construct()

コンストラクタ。

デフォルトの実装では、次の2つの処理を行います。

  • 与えられた設定 $config でオブジェクトを初期化します。
  • init() を呼び出します。

子クラスでこのメソッドをオーバーライドする場合は、次のことを推奨します。

  • コンストラクタの最後のパラメータは、ここでの $config のような設定配列であること。
  • コンストラクタの最後に親の実装を呼び出すこと。
public void __construct ( $config = [] )
$config array

オブジェクトのプロパティを初期化するために使用される名前と値のペア

                public function __construct($config = [])
{
    if (!empty($config)) {
        Yii::configure($this, $config);
    }
    $this->init();
}

            
__get() public メソッド

定義元: yii\base\BaseObject::__get()

オブジェクトプロパティの値を返します。

$value = $object->property; を実行するときに暗黙的に呼び出されるPHPのマジックメソッドであるため、このメソッドを直接呼び出さないでください。

関連項目: __set()

public mixed __get ( $name )
$name string

プロパティ名

return mixed

プロパティの値

throws yii\base\UnknownPropertyException

プロパティが定義されていない場合

throws yii\base\InvalidCallException

プロパティが書き込み専用の場合

                public function __get($name)
{
    $getter = 'get' . $name;
    if (method_exists($this, $getter)) {
        return $this->$getter();
    } elseif (method_exists($this, 'set' . $name)) {
        throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
    }
    throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
}

            
__isset() public メソッド

定義元: yii\base\BaseObject::__isset()

プロパティが設定されているか(つまり、定義されており、nullでないか)を確認します。

isset($object->property) を実行するときに暗黙的に呼び出されるPHPのマジックメソッドであるため、このメソッドを直接呼び出さないでください。

プロパティが定義されていない場合、false が返されることに注意してください。

参照: https://www.php.net/manual/en/function.isset.php

public boolean __isset ( $name )
$name string

プロパティ名またはイベント名

return boolean

指定されたプロパティが設定されているか (null でないか)。

                public function __isset($name)
{
    $getter = 'get' . $name;
    if (method_exists($this, $getter)) {
        return $this->$getter() !== null;
    }
    return false;
}

            
__set() public メソッド

定義元: yii\base\BaseObject::__set()

オブジェクトプロパティの値を設定します。

$object->property = $value; を実行するときに暗黙的に呼び出されるPHPのマジックメソッドであるため、このメソッドを直接呼び出さないでください。

関連項目: __get()

public void __set ( $name, $value )
$name string

プロパティ名またはイベント名

$value mixed

プロパティの値

throws yii\base\UnknownPropertyException

プロパティが定義されていない場合

throws yii\base\InvalidCallException

プロパティが読み取り専用の場合

                public function __set($name, $value)
{
    $setter = 'set' . $name;
    if (method_exists($this, $setter)) {
        $this->$setter($value);
    } elseif (method_exists($this, 'get' . $name)) {
        throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
    } else {
        throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
    }
}

            
__unset() public メソッド

定義元: yii\base\BaseObject::__unset()

オブジェクトプロパティを null に設定します。

unset($object->property) を実行するときに暗黙的に呼び出されるPHPのマジックメソッドであるため、このメソッドを直接呼び出さないでください。

プロパティが定義されていない場合、このメソッドは何もしないことに注意してください。プロパティが読み取り専用の場合、例外がスローされます。

参照: https://www.php.net/manual/en/function.unset.php

public void __unset ( $name )
$name string

プロパティ名

throws yii\base\InvalidCallException

プロパティが読み取り専用の場合。

                public function __unset($name)
{
    $setter = 'set' . $name;
    if (method_exists($this, $setter)) {
        $this->$setter(null);
    } elseif (method_exists($this, 'get' . $name)) {
        throw new InvalidCallException('Unsetting read-only property: ' . get_class($this) . '::' . $name);
    }
}

            
canGetProperty() public メソッド

定義元: yii\base\BaseObject::canGetProperty()

プロパティが読み取り可能かどうかを示す値を返します。

プロパティが読み取り可能であるのは、次のいずれかの場合です。

  • クラスに、指定された名前に関連付けられたgetterメソッドがある場合 (この場合、プロパティ名はcase-insensitiveです)。
  • クラスに、指定された名前のメンバ変数がある場合 ($checkVars が true の場合)。

関連項目: canSetProperty()

public boolean canGetProperty ( $name, $checkVars true )
$name string

プロパティ名

$checkVars boolean

メンバ変数をプロパティとして扱うかどうか

return boolean

プロパティが読み取り可能かどうか

                public function canGetProperty($name, $checkVars = true)
{
    return method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name);
}

            
canSetProperty() public メソッド

定義元: yii\base\BaseObject::canSetProperty()

プロパティが設定可能かどうかを示す値を返します。

プロパティが書き込み可能であるのは、次のいずれかの場合です。

  • クラスに、指定された名前に関連付けられたsetterメソッドがある場合 (この場合、プロパティ名はcase-insensitiveです)。
  • クラスに、指定された名前のメンバ変数がある場合 ($checkVars が true の場合)。

関連項目: canGetProperty()

public boolean canSetProperty ( $name, $checkVars true )
$name string

プロパティ名

$checkVars boolean

メンバ変数をプロパティとして扱うかどうか

return boolean

プロパティが書き込み可能かどうか

                public function canSetProperty($name, $checkVars = true)
{
    return method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name);
}

            
className() public static メソッド
2.0.14以降非推奨。PHP >=5.5 では、代わりに ::class を使用してください。

定義元: yii\base\BaseObject::className()

このクラスの完全修飾名を返します。

public static string className ( )
return string

このクラスの完全修飾名。

                public static function className()
{
    return get_called_class();
}

            
getUploadFileMaxCount() public メソッド

public integer getUploadFileMaxCount ( )
return integer

アップロード可能なファイルの最大数。

                public function getUploadFileMaxCount()
{
    if ($this->_uploadFileMaxCount === null) {
        $this->_uploadFileMaxCount = (int)ini_get('max_file_uploads');
    }
    return $this->_uploadFileMaxCount;
}

            
getUploadFileMaxSize() public メソッド

public integer getUploadFileMaxSize ( )
return integer

アップロード可能なファイルの最大サイズ(バイト単位)。

                public function getUploadFileMaxSize()
{
    if ($this->_uploadFileMaxSize === null) {
        $this->_uploadFileMaxSize = $this->getByteSize(ini_get('upload_max_filesize'));
    }
    return $this->_uploadFileMaxSize;
}

            
hasMethod() public メソッド

定義元: yii\base\BaseObject::hasMethod()

メソッドが定義されているかどうかを示す値を返します。

デフォルトの実装は、PHP関数の method_exists() の呼び出しです。PHPのマジックメソッド __call() を実装した場合は、このメソッドをオーバーライドできます。

public boolean hasMethod ( $name )
$name string

メソッド名

return boolean

メソッドが定義されているかどうか

                public function hasMethod($name)
{
    return method_exists($this, $name);
}

            
hasProperty() public メソッド

定義元: yii\base\BaseObject::hasProperty()

プロパティが定義されているかどうかを示す値を返します。

プロパティは、次の場合に定義されます。

  • クラスに、指定された名前に関連付けられたゲッターまたはセッターメソッドがある場合(この場合、プロパティ名は大文字と小文字を区別しません)。
  • クラスに、指定された名前のメンバ変数がある場合 ($checkVars が true の場合)。

参照

public boolean hasProperty ( $name, $checkVars true )
$name string

プロパティ名

$checkVars boolean

メンバ変数をプロパティとして扱うかどうか

return boolean

プロパティが定義されているかどうか

                public function hasProperty($name, $checkVars = true)
{
    return $this->canGetProperty($name, $checkVars) || $this->canSetProperty($name, false);
}

            
init() public メソッド

定義元: yii\base\BaseObject::init()

オブジェクトを初期化します。

このメソッドは、オブジェクトが与えられた構成で初期化された後、コンストラクターの最後に呼び出されます。

public void init ( )

                public function init()
{
}

            
parse() public メソッド

HTTP リクエストボディを解析します。

public array parse ( $rawBody, $contentType )
$rawBody string

生のHTTPリクエストボディ。

$contentType string

リクエストボディに指定されたコンテンツタイプ。

return array

リクエストボディから解析されたパラメータ

                public function parse($rawBody, $contentType)
{
    if (!$this->force) {
        if (!empty($_POST) || !empty($_FILES)) {
            // normal POST request is parsed by PHP automatically
            return $_POST;
        }
    } else {
        $_FILES = [];
    }
    if (empty($rawBody)) {
        return [];
    }
    if (!preg_match('/boundary="?(.*)"?$/is', $contentType, $matches)) {
        return [];
    }
    $boundary = trim($matches[1], '"');
    $bodyParts = preg_split('/\\R?-+' . preg_quote($boundary, '/') . '/s', $rawBody);
    array_pop($bodyParts); // last block always has no data, contains boundary ending like `--`
    $bodyParams = [];
    $filesCount = 0;
    foreach ($bodyParts as $bodyPart) {
        if (empty($bodyPart)) {
            continue;
        }
        list($headers, $value) = preg_split('/\\R\\R/', $bodyPart, 2);
        $headers = $this->parseHeaders($headers);
        if (!isset($headers['content-disposition']['name'])) {
            continue;
        }
        if (isset($headers['content-disposition']['filename'])) {
            // file upload:
            if ($filesCount >= $this->getUploadFileMaxCount()) {
                continue;
            }
            $fileInfo = [
                'name' => $headers['content-disposition']['filename'],
                'type' => ArrayHelper::getValue($headers, 'content-type', 'application/octet-stream'),
                'size' => StringHelper::byteLength($value),
                'error' => UPLOAD_ERR_OK,
                'tmp_name' => null,
            ];
            if ($fileInfo['size'] > $this->getUploadFileMaxSize()) {
                $fileInfo['error'] = UPLOAD_ERR_INI_SIZE;
            } else {
                $tmpResource = tmpfile();
                if ($tmpResource === false) {
                    $fileInfo['error'] = UPLOAD_ERR_CANT_WRITE;
                } else {
                    $tmpResourceMetaData = stream_get_meta_data($tmpResource);
                    $tmpFileName = $tmpResourceMetaData['uri'];
                    if (empty($tmpFileName)) {
                        $fileInfo['error'] = UPLOAD_ERR_CANT_WRITE;
                        @fclose($tmpResource);
                    } else {
                        fwrite($tmpResource, $value);
                        rewind($tmpResource);
                        $fileInfo['tmp_name'] = $tmpFileName;
                        $fileInfo['tmp_resource'] = $tmpResource; // save file resource, otherwise it will be deleted
                    }
                }
            }
            $this->addFile($_FILES, $headers['content-disposition']['name'], $fileInfo);
            $filesCount++;
        } else {
            // regular parameter:
            $this->addValue($bodyParams, $headers['content-disposition']['name'], $value);
        }
    }
    return $bodyParams;
}

            
setUploadFileMaxCount() public メソッド

public void setUploadFileMaxCount ( $uploadFileMaxCount )
$uploadFileMaxCount integer

アップロード可能なファイルの最大数。

                public function setUploadFileMaxCount($uploadFileMaxCount)
{
    $this->_uploadFileMaxCount = $uploadFileMaxCount;
}

            
setUploadFileMaxSize() public メソッド

public void setUploadFileMaxSize ( $uploadFileMaxSize )
$uploadFileMaxSize integer

アップロード可能なファイルの最大サイズ(バイト単位)。

                public function setUploadFileMaxSize($uploadFileMaxSize)
{
    $this->_uploadFileMaxSize = $uploadFileMaxSize;
}