public function read()
 {
     try {
         // 验证参数的合法性
         $aid = I('get.id');
         $options = array();
         $options['download'] = I('get.download');
         if (!$aid || !is_numeric($aid)) {
             throw new \Exception(L('_ERR_ATID_'));
         }
         $attService = D('Attachment', 'Service');
         if (!$attService->read($aid, $options)) {
             return false;
         }
         $resp = \Component\Common\Response::get_instance();
         return $resp->stop();
     } catch (\Exception $e) {
         $errInfo = $e->getMessage();
         return save_app_log($errInfo, 'component');
         // return get_api_result ('component', array (), $errInfo);
     }
 }
 /**
  * 读取文件
  * 
  * @param int $atid
  * @param array $options
  * 
  * @return bool
  * */
 public function read($atid, $options)
 {
     // 查看附件是否存在
     $attModel = D('Attachment');
     $aid = intval($atid);
     $attInfo = $attModel->where('atid=%d', $aid)->find();
     if (!$attInfo) {
         throw new \Exception(L('_ERR_ATT_NOT_EXITS_', array('id' => $aid)));
     }
     // 显示文件了
     // 获取文件路径
     $uploadDir = rtrim(C('upload.rootPath'), '/') . '/';
     $savePath = trim($attInfo['atpath'], '/') . '/';
     $saveName = $attInfo['atname'];
     $filePath = $uploadDir . $savePath . $saveName;
     $relPath = realpath($filePath);
     // 验证文件是否存在
     if (!file_exists($relPath)) {
         throw new \Exception(L('_ERR_ATT_FILE_NOT_EXITS_'));
     }
     // 最后修改时间
     $filemtime = filemtime($relPath);
     $resp = \Component\Common\Response::get_instance();
     $resp->set_raw_header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $filemtime) . ' GMT');
     // 尝试发送 304响应强制浏览器使用缓存
     if (!empty($_SERVER['HTTP_IF_MODIFIED_SINCE']) && ($HTTP_IF_MODIFIED_SINCE = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $filemtime)) {
         $resp->set_raw_header('Etag: ');
         $resp->set_raw_header("HTTP/1.1 304 Not Modified");
         $resp->send_headers();
         return true;
     }
     // 附件文件的 mime 类型字符串
     $mime = $attInfo['atmine'];
     // 清除输出缓冲
     @ob_end_clean();
     // 处理名称里的符号,避免chrome无法解析问题
     $attInfo['atname'] = str_replace(array('&', '=', ','), '_', $attInfo['atname']);
     if (!$options['download']) {
         $resp->set_raw_header('Content-Disposition: inline; filename=' . $attInfo['atname']);
         $resp->set_raw_header('Content-Type: ' . $mime);
     } else {
         $resp->set_raw_header('Content-Disposition: attachment; filename=' . $attInfo['atname']);
         $resp->set_raw_header('Content-Type: ' . $mime);
     }
     if (!is_file($relPath)) {
         return true;
     }
     // 发送浏览器头
     $resp->set_raw_header("Content-Length: " . filesize($relPath));
     $resp->send_headers();
     $fp = fopen($filePath, 'rb');
     if ($fp) {
         fseek($fp, 0);
         if (function_exists('fpassthru')) {
             fpassthru($fp);
         } else {
             echo @fread($fp, filesize($relPath));
         }
     }
     fclose($fp);
     flush();
     ob_flush();
     return true;
 }