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