<?php
|
|
/**
|
* PhalApi_Request_Formatter_File 格式化上传文件
|
* @package PhalApi\Request
|
* @license http://www.phalapi.net/license GPL 协议
|
* @link http://www.phalapi.net/
|
* @author dogstar <chanzonghuang@gmail.com> 2015-11-07
|
*/
|
class PhalApi_Request_Formatter_File extends PhalApi_Request_Formatter_Base implements PhalApi_Request_Formatter {
|
|
/**
|
* 格式化文件类型
|
*
|
* @param array $rule array('name' => '', 'type' => 'file', 'default' => array(...), 'min' => '', 'max' => '', 'range' => array(...))
|
*
|
* @throws PhalApi_Exception_BadRequest
|
*/
|
public function parse($value, $rule) {
|
|
$default = isset($rule['default']) ? $rule['default'] : NULL;
|
$index = $rule['name'];
|
$fileList = array();
|
|
// 未上传 && (有默认值 || 非必须)
|
if (!isset($_FILES[$index]) && ($default !== NULL || empty($rule['require']))) {
|
return $default;
|
}
|
|
if (is_array($_FILES[$index]['tmp_name'])) {
|
$count = sizeof($_FILES[$index]['tmp_name']);
|
|
for ($i = 0; $i < $count; $i++) {
|
$file = array(
|
'name' => $_FILES[$index]['name'][$i],
|
'type' => $_FILES[$index]['type'][$i],
|
'tmp_name' => $_FILES[$index]['tmp_name'][$i],
|
'error' => $_FILES[$index]['error'][$i],
|
'size' => $_FILES[$index]['size'][$i]
|
);
|
|
$fileList[] = $this->parseOne($file, $rule);
|
}
|
} else {
|
$file = array(
|
'name' => $_FILES[$index]['name'],
|
'type' => $_FILES[$index]['type'],
|
'tmp_name' => $_FILES[$index]['tmp_name'],
|
'error' => $_FILES[$index]['error'],
|
'size' => $_FILES[$index]['size']
|
);
|
// 单个文件直接返回文件信息数组
|
return $this->parseOne($file, $rule);
|
}
|
|
// 返回文件信息二维数组
|
return $fileList;
|
}
|
|
protected function parseOne($file, $rule)
|
{
|
$index = $rule['name'];
|
|
if (!isset($file) || !isset($file['error']) || !is_array($file)) {
|
throw new PhalApi_Exception_BadRequest(T('miss upload file: {file}', array('file' => $index)));
|
}
|
|
if ($file['error'] != UPLOAD_ERR_OK) {
|
throw new PhalApi_Exception_BadRequest(T('fail to upload file with error = {error}', array('error' => $file['error'])));
|
}
|
|
$sizeRule = $rule;
|
$sizeRule['name'] = $sizeRule['name'] . '.size';
|
$this->filterByRange($file['size'], $sizeRule);
|
|
if (!empty($rule['range']) && is_array($rule['range'])) {
|
$rule['range'] = array_map('strtolower', $rule['range']);
|
$this->formatEnumValue(strtolower($file['type']), $rule);
|
}
|
|
//对于文件后缀进行验证
|
if (!empty($rule['ext'])) {
|
$ext = trim(strrchr($file['name'], '.'), '.');
|
if (is_string($rule['ext'])) {
|
$rule['ext'] = explode(',', $rule['ext']);
|
}
|
if (!$ext) {
|
throw new PhalApi_Exception_BadRequest(T('Not the file type {ext}', array('ext' => json_encode($rule['ext']))));
|
}
|
if (is_array($rule['ext'])) {
|
$rule['ext'] = array_map('strtolower', $rule['ext']);
|
$rule['ext'] = array_map('trim', $rule['ext']);
|
if (!in_array(strtolower($ext), $rule['ext'])) {
|
throw new PhalApi_Exception_BadRequest(T('Not the file type {ext}', array('ext' => json_encode($rule['ext']))));
|
}
|
}
|
}
|
|
return $file;
|
}
|
}
|