<?php /** * 【考试中心-手机端】媒体文件上传或取消 * UploadController.class.php * @author: 蔡建华 * @date: 2017-05-23 */ namespace Api\Controller\Answer; use Common\Common\AttachOperation; use VcySDK\Service; use VcySDK\Attach; use Common\Service\AnswerDetailService; use Common\Service\AnswerAttachService; class UploadController extends AbstractController { /** @var string 文件信息 */ private $__file_info = ''; /** @var Attach 附件信息 */ private $__attach = null; /** @var AnswerAttachService */ protected $answer_attach_serv; public function before_action($action = '') { if (!parent::before_action($action)) { return false; } // 初始化附件表service $this->answer_attach_serv = new AnswerAttachService(); return true; } public function Index_post() { // 接收post参数 $params = I('post.'); // 答题id $ead_id = intval($params['ead_id']); // 答题id为空,返回提示"题目ID不能为空" if (!$ead_id) { E('_ERR_ECT_ID_EMPTY_FOR_VOICE'); } // 语音顺序编号 $order_id = $params['order_id']; // 语音顺序编号为空,返回提示"语音顺序编号" if (!$order_id) { E('_ERR_ID_ORDER_FOR_VOICE'); } // 实例化答卷详情service $answer_detail_s = new AnswerDetailService(); // 根据答题id获取答题详情数据 $data = $answer_detail_s->get($ead_id); // 答题详情数据为空,返回提示"题目信息不存在" if (empty($data)) { E('_ERR_COUNT_DETAIL_EMPTY_FOR_VOICE'); } // 媒体文件id为空 if (empty($params['media_id'])) { // 移除媒体文件 $result = $this->remove($params, $data['ea_id']); // 移除失败 if (!$result) { return false; } } else { // 上传媒体文件 $result = $this->add_media($params, $data['ea_id'], $data['ep_id']); // 上次失败 if ($result) { return false; } } return true; } /** * 上传媒体文件 * * @param array $params * @param int $ea_id 答卷id * @param int $ep_id 试卷id * * @return mixed */ private function add_media($params = [], $ea_id = 0, $ep_id = 0) { // 媒体文件id为空或者不是一个标量,返回提示"语音文件不存在" if (empty($params['media_id']) || !is_scalar($params['media_id'])) { E('_ERR_VOICE_UPLOAD_MEDIA_IS_EMPTY'); } // 初始化 $serv = &Service::instance(); $this->__attach = new Attach($serv); $is_complete = AnswerAttachService::IS_COMPLETE_NO; $at_id = ''; $file_type = ''; // 文件类型:音频 if (AnswerAttachService::TYPE_VOICE == $params['type']) { // 新增音频文件 $at_id = $this->add_voice($params); if (!$at_id) { return false; } // 文件类型:音频 $file_type = AnswerAttachService::TYPE_VOICE; // 文件没有转换完毕 $is_complete = AnswerAttachService::IS_COMPLETE_NO; } elseif (AnswerAttachService::TYPE_IMAGE == $params['type']) { // 文件类型:图片,新增图片文件 $at_id = $this->add_image($params); if (!$at_id) { return false; } // 文件类型:图片 $file_type = AnswerAttachService::TYPE_IMAGE; // 文件转换完毕 $is_complete = AnswerAttachService::IS_COMPLETE_YES; } else { // 返回提示"未知的媒体文件类型" E('_ERR_NOT_KNOW_MEDIA_TYPE'); } // 待存数据 $data = [ 'ead_id' => $params['ead_id'], 'ea_id' => $ea_id, 'order_id' => $params['order_id'], 'media_id' => $params['media_id'], 'is_complete' => $is_complete, 'at_id' => $at_id, 'type' => $file_type, 'file_info' => serialize($this->__file_info) ]; // 附件处理 $attach_serv = new AttachOperation(); $attach_serv->insert_attach( APP_DIR, 'paper', $ep_id, ['attach_ids' => [$at_id]] ); // 写入附件表 return $this->answer_attach_serv->insert($data); } /** * 移除媒体文件 * * @param array $params * @param int $ea_id 答卷id * * @return bool */ private function remove($params = [], $ea_id = 0) { // 删除条件:答题id,答卷id,顺序编号 $del_conds = [ 'ead_id' => $params['ead_id'], 'ea_id' => $ea_id, 'order_id' => $params['order_id'] ]; // 获取附件ID $attach = $this->answer_attach_serv->get_by_conds($del_conds); // 删除UC附件服务器的附件文件 $attach_serv = new AttachOperation(); $attach_serv->deleteFile([$attach['at_id']]); // 移除附件 return $this->answer_attach_serv->delete_by_conds($del_conds); } /** * 新增语音文件 * * @param array $params * * @return bool|string */ private function add_voice($params = []) { // 文件信息 $this->__file_info = $params['info']; // 语音时长未设置,返回提示"语音文件需指定时长" if (!isset($this->__file_info['length'])) { E('_ERR_UPLOAD_VOICE_LENGTH_ERROR'); } // 重新整理文件信息 $this->__file_info = [ 'length' => $this->__file_info['length'] ]; // 回调URL参数 $oaurl_params = [ 'ead_id' => $params['ead_id'], 'order_id' => $params['order_id'] ]; // 转换完毕后的回调 URL $url = oaUrl('/Frontend/Callback/Upload/Index', $oaurl_params); // 获取微信服务号多媒体信息条件 $attach_conds = [ 'memUid' => $this->uid, 'mediaId' => $params['media_id'], 'fileType' => Attach::TYPE_AUDIO, 'callbackUrl' => $url ]; // 获取微信服务号多媒体信息 $result = $this->__attach->getMedia($attach_conds); // 获取微信服务号多媒体信息为空,返回提示"语音答题文件上传失败" if (!$result || empty($result['atId'])) { E('_ERR_UPLOAD_VOICE_FAILED'); } return $result['atId']; } /** * 新增图片文件 * * @param $params * * @return bool|string */ private function add_image($params) { // 文件信息初始化 $this->__file_info = []; // 获取微信服务号多媒体信息条件 $attach_conds = [ 'memUid' => $this->uid, 'mediaId' => $params['media_id'], 'fileType' => Attach::TYPE_IMG ]; // 获取微信服务号多媒体信息 $result = $this->__attach->getMedia($attach_conds); // 获取微信服务号多媒体信息为空,返回提示"图片答题文件上传失败" if (!$result || empty($result['atId'])) { E('_ERR_UPLOAD_IMAGE_FAILED'); } return $result['atId']; } }