UploadController.class.php 7.51 KB
<?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'];
    }
}