百度翻译 的文档是需要消费的,并且它的api请求是一个异步的过程,如果业务上用户不需要登录的时候,无法直接获取到翻译结果文档。因此,做了个异步返回的功能。
思路:
1、上传文档;
2、调用翻译接口;
3、通过kafka监听接口回调,处理返回数据,保存到本地(方便以后扩展,如加入用户信息,查看我的翻译记录)
4、前端监听后端服务,通过swoole的websocket实时请求文档数据
关键部分代码(赶工做的,未做优化):
//上传文件
public function upload()
{
header("Access-Control-Allow-Origin:*");
set_time_limit(300);
$file = $_FILES['file'];
if(!$file){
$show = array('status'=>422,'message'=>'请上传图片或者文档文件');
json($show);
}
$app = '2020bd';
if($_SERVER['SERVER_ADDR']=='127.0.0.1'){
$sPath = '/Users/kunyuan/www/activity/storage/'.$app.'/';
}else{
$sPath = '/var/www/html/activity/storage/'.$app.'/';
}
if(!mk_dir($sPath)){
$show = array('status'=>500,'message'=>'目录不存在');
json($show);
}
$path_parts = pathinfo($file['name']);
$ext = strtolower($path_parts["extension"]);
$extAry = array(
'jpg','jpeg','png','docx','xls','xlsx','ppt','pptx','pdf'
);
if(!in_array($ext, $extAry)){
$show = array('status'=>422,'message'=>'请上传图片或者文档文件');
json($show);
}
try{
//保存到服务器本地
$filename = date('Ymd'). '_' .rand(10000, 99999).'_'.time();
$tmpfile = $filename . '.'.$ext;
$tmp = $file["tmp_name"];
$img = file_get_contents($tmp);
$path1 = $sPath . $tmpfile;
$res = file_put_contents($path1, $img);
if(is_https()){
$url = 'https://'.$_SERVER['SERVER_NAME'].'/storage/'.$app.'/'.$tmpfile;
}else{
$url = 'http://'.$_SERVER['SERVER_NAME'].'/storage/'.$app.'/'.$tmpfile;
}
$error = '上传失败';
if($res){
//判断文件类型,为了文件调用百度的图片接口或者文档接口
if(in_array($ext,array('jpg','jpeg','png'))){
$resExt = 'pic';
}else{
$resExt = 'docs';
}
//保存数据库
$fileid = $this->common->setFiles(array(
'sourceFile' => $url,
'localFile' => $path1,
'type' => $resExt
));
$show = array('status'=>0,'fileUrl'=>$url,'fileSize'=>ceil(filesize($path1)/1000)."k",'ext'=>$resExt, 'id' => $fileid,'resExt'=>$resExt);
}else{
$show = array('status'=>500,'message'=>$error,'info'=>$info,'fileSize'=>ceil(filesize($path1)/1000)."k");
}
json($show);
}catch(Exception $e){
$show = array('status'=>$e->getCode(),'message'=>$e->getMessage());
json($show);
}
}
//调用百度接口
public function api()
{
//$type = I('type','docs');
$id = I('id',0);
$callback = I('callback');
//判断是否为上传的文件
$data = $this->common->getFiles(array('id'=>$id));
if(empty($data)){
$show = array('status'=>420,'message'=>'数据有误');
json($show, $callback);
}
$type = $data['type'];
switch($type){
case 'docs':
$this->docsTran($data);
break;
case 'pic':
$this->picTran($data);
break;
default:
$this->docsTran($data);
break;
}
}
//文档翻译接口
private function docsTran($data)
{
//die('ooo');
$file = $data['localFile'];//I('file');
$from = I('from', 'zh');
$to = I('to','en');
$callback = I('callback');
if(empty($file)){
$show = array('status'=>422,'message'=>'请上传文档文件');
json($show, $callback);
}
$path_parts = pathinfo($file);
$ext = strtolower($path_parts["extension"]);
$extAry = array(
'docx','xls','xlsx','ppt','pptx','pdf'
);
if(!in_array($ext, $extAry)){
$show = array('status'=>423,'message'=>'请上传文档文件