path = str_replace('/', BS, $data['path']); $this->path = str_replace('dzz::', '', $data['path']); } else { $this->iscloud = true; $this->path = $data['path']; } $this->appid = $data['appid']; $this->processname = 'PICHOMEVAPPISDEL_' . $data['appid']; $this->uid = $data['uid']; $this->username = $data['username']; $this->exportstatus = $data['state']; $this->donum = $data['donum']; $this->filenum = $data['filenum']; $this->lastid = $data['lastid']; $this->defaultperm = isset($data['perm']) ? intval($data['perm']) : 0; } public function getpathdata($folderdata, $appid, $pathdata = array()) { foreach ($folderdata as $v) { $pathdata[$v['id'] . $appid] = $v['name']; if ($v['children']) { $tmpchild = $v['children']; $pathdata = $this->getpathdata($tmpchild, $appid, $pathdata); } } return $pathdata; } public function initFoldertag() { if (dzz_process::getlocked($this->processname)) exit('vapp isdeleted'); $jsonfile = ($this->iscloud) ? $this->path . '/metadata.json' : $this->path . BS . 'metadata.json'; $appdatas = file_get_contents(IO::getStream($jsonfile)); //解析出json数据 $appdatas = json_decode($appdatas, true); //目录数据 $folderdata = $appdatas['folders']; $efids = C::t('#eagle#eagle_folderrecord')->insert_folderdata_by_appid($this->appid, $folderdata, $this->defaultperm); $delids = []; foreach (DB::fetch_all("select id from %t where efid not in(%n) and appid = %s", array('eagle_folderrecord', $efids, $this->appid)) as $delid) { $delids[] = $delid['id']; } //删除多余目录 foreach (DB::fetch_all("select f.fid from %t f left join %t ef on f.fid=ef.fid where f.appid = %s and ISNULL(ef.id)", array('pichome_folder', 'eagle_folderrecord', $this->appid)) as $dv) { C::t('pichome_folder')->delete_by_fids($dv); } //对比目录数据 if ($delids) C::t('#eagle#eagle_folderrecord')->delete_by_ids($delids); //标签数据 $tagdata = $appdatas['tagsGroups']; $currentcids = []; $tids = []; foreach ($tagdata as $v) { $taggroupdata = [ 'cid' => $v['id'] . $this->appid, 'catname' => $v['name'], 'appid' => $this->appid, 'dateline' => TIMESTAMP ]; //插入或更新标签分类数据 $cid = C::t('pichome_taggroup')->insert($taggroupdata); $currentcids[] = $cid; foreach ($v['tags'] as $val) { $tid = C::t('pichome_tag')->insert($val, 1); $tids[] = $tid; if ($cid) { $relasetarr = ['cid' => $cid, 'tid' => $tid, 'appid' => $this->appid]; C::t('pichome_tagrelation')->insert($relasetarr); } } } if ($tids) { //查询关系表中包含的不存在的标签关系 $drids = []; foreach (DB::fetch_all("select id from %t where tid not in(%n) and appid = %s", array('pichome_tagrelation', $tids, $this->appid)) as $rv) { $drids[] = $rv['id']; } //删除不存在的标签关系数据 C::t('pichome_tagrelation')->delete($drids); } $ocids = C::t('pichome_taggroup')->fetch_cid_by_appid($this->appid); $delcids = array_diff($ocids, $currentcids); C::t('pichome_taggroup')->delete_by_cids($delcids); return true; } //读取云存储数据 public function readcloudDirdata($path, $force = 0) { $prepatharr = explode(':', $path); //获取mtime.json $mtimejsonfile = $this->path . '/mtime.json'; $mtimedata = file_get_contents(IO::getStream($mtimejsonfile)); if ($mtimedata) { $vappmtimedata = json_decode($mtimedata, true); unset($mtimedata); $this->filenum = $vappmtimedata['all']; unset($vappmtimedata); } else { return array('error' => '信息获取失败'); } /* $prepath = $prepatharr[2]; $returndata = IO::getFolderlist($path,$nextmarker,$by,$order,$limit,$force); if($returndata['error']){ return array('error'=>$returndata['error']); }else{ foreach($returndata['folder'] as $v){ if(dzz_process::getlocked($this->processname)) exit('vapp isdeleted'); $v = str_replace($prepath,'',$v); $v = trim($v,'/'); if(IO::checkfileexists($this->path.'/images/'.$v.'/metadata.json')){ $this->filenum++; fwrite($thandle, $v . "\n"); } } } runlog('aaaaeagle',print_r($returndata,true)); if($returndata['IsTruncated']){ $istruncated = $returndata['NextMarker']; unset($returndata); $this->readcloudDirdata($thandle,$path,$istruncated,$by,$order,$limit,$force); }else{ return array('success'=>true); }*/ } //读取本地目录数据 public function readLocalDirdata($thandle, $path) { if ($dch = opendir($path)) { while (($file = readdir($dch)) != false) { if (dzz_process::getlocked($this->processname)) exit('vapp isdeleted'); if ($file != '.' && $file != '..') { $filePath = $path . '/' . $file; //if (is_dir($filePath) && IO::checkfileexists($filePath . '/metadata.json')) { $this->filenum++; fwrite($thandle, $file . "\n"); // } unset($filePath); unset($file); } } closedir($dch); } else { return array('error' => 'Read Dir Failer'); } } //生成记录文件 public function createReadTxt($readtxt) { $filedir = ($this->iscloud) ? $this->path . '/images' : $this->path . BS . 'images'; $this->filenum = 0; if ($this->iscloud) { $readreturn = $this->readcloudDirdata($filedir); } else { $thandle = fopen($readtxt, 'w+'); $readreturn = $this->readLocalDirdata($thandle, $filedir); fclose($thandle); } if ($readreturn['error']) { C::t('pichome_vapp')->update($this->appid, array('state' => 0)); return array('error' => $readreturn['error']); } $this->initFoldertag(); C::t('pichome_vapp')->update($this->appid, array('filenum' => $this->filenum, 'state' => 2)); return array('success' => true); } //初始化导入 public function initExport() { $readtxt = $this->readtxt . 'eagleexport' . md5($this->path) . '.txt'; //如果导入时没有记录文件 if (!is_file($readtxt)) { $readdata = $this->createReadTxt($readtxt); } else { //如果有记录文件,则对比记录文件生成时间和metadata.json时间,如果记录时间小于metadata.json时间重新生成记录文件 $metapath = ($this->iscloud) ? $this->path . '/metadata.json' : $this->path . BS . 'metadata.json'; $metadatainfo = IO::getMeta($metapath); if (filemtime($readtxt) < $metadatainfo['dateline']) { $readdata = $this->createReadTxt($readtxt); } else { $this->initFoldertag(); C::t('pichome_vapp')->update($this->appid, array('state' => 2)); } } if (isset($readdata) && $readdata['error']) { return array('error' => $readdata['error']); } else { return array('success' => true); } } //获取文件可访问的真实地址 public function getFileRealFileName($filepath, $filename, $ext) { $charsetarr = ['GBK', 'GB18030']; $returnname = $filename; if (!is_file($filepath . BS . $filename . '.' . $ext)) { foreach ($charsetarr as $v) { $filemetadataname = diconv($filename, CHARSET, $v); if (is_file($filepath . BS . $filemetadataname . '.' . $ext)) { $returnname = $filemetadataname; break; } } } return $returnname; } //生成主键rid public function createrid() { $microtime = microtime(); list($msec, $sec) = explode(' ', $microtime); $msec = $msec * 1000000; $idstr = md5($sec . $msec . random(6) . $this->appid); if (DB::result_first("select count(rid) from %t where rid = %s", array('pichome_resources', $idstr))) { $this->create_id(); } return $idstr; } public function execExport($force = false) { if ($this->iscloud) { return $this->execExportCloud($force); } else { $filedir = ($this->iscloud) ? $this->path . '/images' : $this->path . BS . 'images'; $readtxt = $this->readtxt . 'eagleexport' . md5($this->path) . '.txt'; if (filesize($readtxt) == 0) { @unlink($readtxt); C::t('pichome_vapp')->update($this->appid, array('lastid' => 0, 'percent' => 100, 'donum' => 0, 'state' => 3, 'filenum' => $this->filenum)); return array('success' => true); } if ($this->lastid) { $start = $this->lastid; } else $start = 0; $spl_object = new SplFileObject($readtxt, 'rb'); $spl_object->seek($start); if ($this->lastid < $this->filenum && $this->exportstatus == 2) { $i = 0; while (is_file($readtxt) && !$spl_object->eof()) { if (dzz_process::getlocked($this->processname)) exit('vapp isdeleted'); $i++; if ($i > $this->onceexportnum) { break; } $file = $spl_object->current(); $file = trim($file); $filePath = $filedir . '/' . $file; $id = trim(str_replace('.info', '', $file)); //文件路径 $tmppath = $filePath; unset($filePath); //文件信息文件路径 $metadatajsonfile = ($this->iscloud) ? $tmppath . '/metadata.json' : $tmppath . BS . 'metadata.json'; //尝试获取记录表记录 $rdata = C::t('#eagle#eagle_record')->fetch_by_eid($id, $this->appid); $rid = ''; if (!isset($rdata['rid'])) { $orid = $id . $this->appid;//原来rid格式 if ($lastdate = DB::result_first("select lastdate from %t where rid = %s", array('pichome_resources', $orid))) { $rid = $orid; } } else { $rid = $rdata['rid']; $lastdate = $rdata['dateline']; } //判断是否含有数据信息文件 if (IO::checkfileexists($metadatajsonfile)) { $metadatajsonfileinfo = IO::getMeta($metadatajsonfile); $flastdate = $metadatajsonfileinfo['dateline']; $metadata = file_get_contents(IO::getStream($metadatajsonfile)); $filemetadata = json_decode($metadata, true); //如果是删除状态,并且已有数据则执行删除 if ($filemetadata['isDeleted']) { if ($rid) C::t('pichome_resources')->delete_by_rid($rid); } else { //如果不是新生成rid if ($rid) { $data = C::t('pichome_resources')->fetch($rid); //判断最后更新时间 if ($force || $lastdate < $flastdate) { $filemetadataname = ($this->iscloud) ? $filemetadata['name'] : $this->getFileRealFileName($tmppath, $filemetadata['name'], $filemetadata['ext']); //文件名称 $filename = $filemetadataname . '.' . $filemetadata['ext']; //缩略图名称 $thumbname = $filemetadataname . '_thumbnail.png'; //文件路径 $file = ($this->iscloud) ? $tmppath . '/' . $filename : $tmppath . BS . $filename; //缩略图路径 $thumbfile = ($this->iscloud) ? $tmppath . '/' . $thumbname : $tmppath . BS . $thumbname; $realfolderdata = []; if (!empty($filemetadata['folders'])) { $realfolderdata = C::t('#eagle#eagle_folderrecord')->fetch_fid_by_efid($filemetadata['folders'], $this->appid); } $currentperm = (!empty($realfolderdata)) ? max($realfolderdata) : $this->defaultperm; $realfids = array_keys($realfolderdata); $haspassword = false; if (!empty($realfids)) { //如果目录含有密码则不导入数据直接跳过 $haspassword = C::t('pichome_folder')->check_haspasswrod($realfids, $this->appid); } if ($haspassword) { C::t('pichome_resources')->delete_by_rid($rid); } else { //如果mtime发生变化则删除原数据,重新导入 if ($data['mtime'] < $filemetadata['mtime']) { C::t('pichome_resources')->delete_by_rid($rid); $filemetadata['rid'] = $this->createrid(); $filemetadata['filename'] = $filemetadata['name']; $filemetadata['file'] = $file; $filemetadata['thumbfile'] = $thumbfile; $filemetadata['rid'] = $rid; $filemetadata['mtime'] = $filemetadata['mtime'] ? $filemetadata['mtime'] : $filemetadata['modificationTime']; $filemetadata['btime'] = $filemetadata['btime'] ? $filemetadata['btime'] : $filemetadata['modificationTime']; $filemetadata['dateline'] = $filemetadata['lastModified']; $filemetadata['lastdate'] = $flastdate; $filemetadata['folders'] = $realfids; $filemetadata['level'] = $currentperm; $this->exportfile($id, $filemetadata); unset($filemetadata); } else { //信息表数据记录 $setarr = ['appid' => $this->appid]; $setarr['searchval'] = $filemetadata['name']; //查询原数据中的属性信息 $attrdata = C::t('pichome_resources_attr')->fetch($rid); $filename = $filemetadata['name'] . '.' . $filemetadata['ext']; //检查reources数据变化 $resourcesarr = [ 'name' => $filename, 'dateline' => $filemetadata['lastModified'], 'isdelete' => $filemetadata['isDeleted'], 'grade' => $filemetadata['star'] ? intval($filemetadata['star']) : 0, 'lastdate' => $flastdate, 'width' => $filemetadata['width'] ? $filemetadata['width'] : 0, 'height' => $filemetadata['height'] ? $filemetadata['height'] : 0, 'appid' => $this->appid, 'level' => $currentperm, 'fids' => implode(',', $realfids) ]; $file = str_replace('/', BS, $file); $attachment = str_replace($this->path . BS, '', $file); $path = str_replace('/', BS, $attachment); $thumb = IO::checkfileexists($thumbfile) ? 1 : 0; $thumbfile = str_replace(array(DZZ_ROOT, BS), array('', '/'), $thumbfile); $setarr['path'] = $path; $resourcesarr['hasthumb'] = $thumb; $resourcesarr['rid'] = $rid; if (C::t('#eagle#eagle_record')->insert_data($id, $resourcesarr)) { //缩略图数据 /* $thumbrecorddata = [ 'rid'=>$rid, 'ext'=>$filemetadata['ext'] ]; if($thumb){ $imgdata = @getimagesize($filemetadata['thumbfile']); $swidth = isset($imgdata[0]) ? $imgdata[0] : 0; $sheight = isset($imgdata[1]) ? $imgdata[1] : 0; $thumbrecorddata['spath'] = $filemetadata['thumbfile']; $thumbrecorddata['sstatus'] = 1; $thumbrecorddata['swidth'] = $swidth; $thumbrecorddata['sheight'] = $sheight; } C::t('thumb_record')->insert_data($thumbrecorddata);*/ //检查标签变化 //标签数据 $tags = $filemetadata['tags']; $setarr['searchval'] .= implode('', $tags); //现有标签 $tagids = []; //原有标签 $oldtids = []; if ($attrdata['tag']) $oldtids = explode(',', $attrdata['tag']); if (!empty($tags)) { $tagids = $this->addtag($tags); $setarr['tag'] = implode(',', $tagids); } $addtags = array_diff($tagids, $oldtids); $deltags = array_diff($oldtids, $tagids); if (!empty($deltags)) C::t('pichome_resourcestag')->delete_by_ridtid($rid, $deltags); foreach ($addtags as $tid) { $rtag = ['appid' => $this->appid, 'rid' => $rid, 'tid' => $tid]; C::t('pichome_resourcestag')->insert($rtag); } //检查标注变化 if (isset($filemetadata['comments'])) { $cids = []; foreach ($filemetadata['comments'] as $commentval) { $tcommentval['id'] = $commentval['id'] . $this->appid; $tcommentval['appid'] = $this->appid; $tcommentval['rid'] = $rid; $tcommentval['x'] = number_format($commentval['x'], 2); $tcommentval['y'] = number_format($commentval['y'], 2); $tcommentval['width'] = $commentval['width']; $tcommentval['height'] = $commentval['height']; $tcommentval['annotation'] = $commentval['annotation']; $tcommentval['lastModified'] = $commentval['lastModified']; try { C::t('pichome_comments')->insert($tcommentval); $setarr['searchval'] .= $tcommentval['annotation']; } catch (Exception $e) { } $cids[] = $tcommentval['id']; unset($tcommentval); } $ocids = C::t('pichome_comments')->fetch_id_by_rid($rid); $delcids = array_diff($ocids, $cids); if (!empty($delcids)) C::t('pichome_comments')->delete($delcids); } else { C::t('pichome_comments')->delete_by_rid($rid); } $rfids = []; $orfids = C::t('pichome_folderresources')->fetch_id_by_rid($rid); C::t('pichome_folderresources')->delete($orfids); $setarr['searchval'] .= $resourcesarr['name']; //检查目录变化 foreach ($realfids as $fv) { $fid = $fv; if (!C::t('pichome_folder')->check_password_byfid($fid)) { $frsetarr = ['appid' => $this->appid, 'rid' => $rid, 'fid' => $fid]; C::t('pichome_folderresources')->insert($frsetarr); // $fids[] = $fid; } } //尝试更新属性表数据 $setarr['link'] = $filemetadata['url'] ? trim($filemetadata['url']) : ''; //描述数据 $setarr['desc'] = $filemetadata['annotation'] ? $filemetadata['annotation'] : ''; $setarr['searchval'] .= getstr($setarr['desc'],255) . $setarr['link']; if ($filemetadata['duration']) $setarr['duration'] = number_format($filemetadata['duration'], 2); $setarr['rid'] = $rid; C::t('pichome_resources_attr')->insert($setarr); unset($filemetadata); unset($setarr); } } } } else { if (!$rdata) { $setarr = [ 'appid' => $this->appid, 'rid' => $rid, 'eid' => $id, 'dateline' => $flastdate ]; C::t('#eagle#eagle_record')->insert($setarr); } } } else { $realfolderdata = []; if (!empty($filemetadata['folders'])) { $realfolderdata = C::t('#eagle#eagle_folderrecord')->fetch_fid_by_efid($filemetadata['folders'], $this->appid); } $currentperm = (!empty($realfolderdata)) ? max($realfolderdata) : $this->defaultperm; $realfids = array_keys($realfolderdata); if (!empty($realfids)) { //如果目录含有密码则不导入数据直接跳过 $haspassword = C::t('pichome_folder')->check_haspasswrod($realfids, $this->appid); } else { $haspassword = false; } if (!$haspassword) { $filemetadataname = ($this->iscloud) ? $filemetadata['name'] : $this->getFileRealFileName($tmppath, $filemetadata['name'], $filemetadata['ext']); $filename = $filemetadataname . '.' . $filemetadata['ext']; $thumbname = $filemetadataname . '_thumbnail.png'; $file = ($this->iscloud) ? $tmppath . '/' . $filename : $tmppath . BS . $filename; $thumbfile = ($this->iscloud) ? $tmppath . '/' . $thumbname : $tmppath . BS . $thumbname; $filemetadata['filename'] = $filemetadata['name']; $filemetadata['file'] = $file; unset($file); $filemetadata['thumbfile'] = $thumbfile; $filemetadata['folders'] = $realfids; $filemetadata['level'] = $currentperm; unset($thumbfile); $filemetadata['rid'] = $this->createrid(); $filemetadata['mtime'] = $filemetadata['mtime'] ? $filemetadata['mtime'] : $filemetadata['modificationTime']; $filemetadata['btime'] = $filemetadata['btime'] ? $filemetadata['btime'] : $filemetadata['modificationTime']; $filemetadata['dateline'] = $filemetadata['lastModified']; $filemetadata['lastdate'] = $flastdate; $this->exportfile($id, $filemetadata); unset($filemetadata); } } } } else { //如果已有数据删除,否则不做处理 if (!$rid) C::t('pichome_resources')->delete_by_rid($rid); } $this->donum += 1; $percent = floor(($this->donum / $this->filenum) * 100); //防止因获取文件总个数不准确百分比溢出 $percent = ($percent > 100) ? 100 : $percent; $state = ($percent >= 100) ? 3 : 2; if ($state == 3) { $spl_object = false; @unlink($this->readtxt . 'eagleexport' . md5($this->path) . '.txt'); $lastid = 0; $percent = 0; $this->donum = 0; } else { $lastid = $this->donum; } //记录导入起始位置,以备中断后从此处,更改导入状态为正在导入 C::t('pichome_vapp')->update($this->appid, array('lastid' => $lastid, 'percent' => $percent, 'donum' => $this->donum, 'state' => $state, 'filenum' => $this->filenum)); if ($spl_object) $spl_object->next(); } } return array('success' => true); } } public function execExportCloud($force = false) { $filedir = $this->path . '/images'; $prepatharr = explode(':', $filedir); $prepath = $prepatharr[2]; if ($this->exportstatus == 2) { $nextmarker = $this->lastid ? $this->lastid : ''; $returndata = IO::getFolderlist($filedir, $nextmarker, 'time', 'DESC', $this->onceexportnum); if ($returndata['error']) { return array('error' => $returndata['error']); } else { $i = 0; foreach ($returndata['folder'] as $v) { if (dzz_process::getlocked($this->processname)) exit('vapp isdeleted'); $v = str_replace($prepath, '', $v); $v = trim($v, '/'); if (dzz_process::getlocked($this->processname)) exit('vapp isdeleted'); $file = $v; $file = trim($file); $filePath = $filedir . '/' . $file; $id = trim(str_replace('.info', '', $file)); //文件路径 $tmppath = $filePath; unset($filePath); //文件信息文件路径 $metadatajsonfile = ($this->iscloud) ? $tmppath . '/metadata.json' : $tmppath . BS . 'metadata.json'; //尝试获取记录表记录 $rdata = C::t('#eagle#eagle_record')->fetch_by_eid($id, $this->appid); $rid = ''; if (!isset($rdata['rid'])) { $orid = $id . $this->appid;//原来rid格式 if ($lastdate = DB::result_first("select lastdate from %t where rid = %s", array('pichome_resources', $orid))) { $rid = $orid; } } else { $rid = $rdata['rid']; $lastdate = $rdata['dateline']; } //判断是否含有数据信息文件 if (IO::checkfileexists($metadatajsonfile)) { $metadatajsonfileinfo = IO::getMeta($metadatajsonfile); $flastdate = $metadatajsonfileinfo['dateline']; $metadata = file_get_contents(IO::getStream($metadatajsonfile)); $filemetadata = json_decode($metadata, true); //如果是删除状态,并且已有数据则执行删除 if ($filemetadata['isDeleted']) { if ($rid) C::t('pichome_resources')->delete_by_rid($rid); } else { //如果不是新生成rid if ($rid) { $data = C::t('pichome_resources')->fetch($rid); //判断最后更新时间 if ($force || $lastdate < $flastdate) { $filemetadataname = ($this->iscloud) ? $filemetadata['name'] : $this->getFileRealFileName($tmppath, $filemetadata['name'], $filemetadata['ext']); //文件名称 $filename = $filemetadataname . '.' . $filemetadata['ext']; //缩略图名称 $thumbname = $filemetadataname . '_thumbnail.png'; //文件路径 $file = ($this->iscloud) ? $tmppath . '/' . $filename : $tmppath . BS . $filename; //缩略图路径 $thumbfile = ($this->iscloud) ? $tmppath . '/' . $thumbname : $tmppath . BS . $thumbname; $realfolderdata = []; if (!empty($filemetadata['folders'])) { $realfolderdata = C::t('#eagle#eagle_folderrecord')->fetch_fid_by_efid($filemetadata['folders'], $this->appid); } $currentperm = (!empty($realfolderdata)) ? max($realfolderdata) : $this->defaultperm; $realfids = array_keys($realfolderdata); $haspassword = false; if (!empty($realfids)) { //如果目录含有密码则不导入数据直接跳过 $haspassword = C::t('pichome_folder')->check_haspasswrod($realfids, $this->appid); } if ($haspassword) { C::t('pichome_resources')->delete_by_rid($rid); } else { //如果mtime发生变化则删除原数据,重新导入 if ($data['mtime'] < $filemetadata['mtime']) { C::t('pichome_resources')->delete_by_rid($rid); $filemetadata['rid'] = $this->createrid(); $filemetadata['filename'] = $filemetadata['name']; $filemetadata['file'] = $file; $filemetadata['thumbfile'] = $thumbfile; $filemetadata['rid'] = $rid; $filemetadata['mtime'] = $filemetadata['mtime'] ? $filemetadata['mtime'] : $filemetadata['modificationTime']; $filemetadata['btime'] = $filemetadata['btime'] ? $filemetadata['btime'] : $filemetadata['modificationTime']; $filemetadata['dateline'] = $filemetadata['lastModified']; $filemetadata['lastdate'] = $flastdate; $filemetadata['folders'] = $realfids; $filemetadata['level'] = $currentperm; $this->exportfile($id, $filemetadata); unset($filemetadata); } else { //信息表数据记录 $setarr = ['appid' => $this->appid]; $setarr['searchval'] = $filemetadata['name']; //查询原数据中的属性信息 $attrdata = C::t('pichome_resources_attr')->fetch($rid); $filename = $filemetadata['name'] . '.' . $filemetadata['ext']; //检查reources数据变化 $resourcesarr = [ 'name' => $filename, 'dateline' => $filemetadata['lastModified'], 'isdelete' => $filemetadata['isDeleted'], 'grade' => $filemetadata['star'] ? intval($filemetadata['star']) : 0, 'lastdate' => $flastdate, 'width' => $filemetadata['width'] ? $filemetadata['width'] : 0, 'height' => $filemetadata['height'] ? $filemetadata['height'] : 0, 'appid' => $this->appid, 'level' => $currentperm, 'fids' => implode(',', $realfids) ]; $file = str_replace('/', BS, $file); $attachment = str_replace($this->path . BS, '', $file); $path = str_replace('/', BS, $attachment); $thumb = IO::checkfileexists($thumbfile) ? 1 : 0; $thumbfile = str_replace(array(DZZ_ROOT, BS), array('', '/'), $thumbfile); $setarr['path'] = $path; $resourcesarr['hasthumb'] = $thumb; $resourcesarr['rid'] = $rid; if (C::t('#eagle#eagle_record')->insert_data($id, $resourcesarr)) { //缩略图数据 /* $thumbrecorddata = [ 'rid'=>$rid, 'ext'=>$filemetadata['ext'] ]; if($thumb){ $imgdata = @getimagesize($filemetadata['thumbfile']); $swidth = isset($imgdata[0]) ? $imgdata[0] : 0; $sheight = isset($imgdata[1]) ? $imgdata[1] : 0; $thumbrecorddata['spath'] = $filemetadata['thumbfile']; $thumbrecorddata['sstatus'] = 1; $thumbrecorddata['swidth'] = $swidth; $thumbrecorddata['sheight'] = $sheight; } C::t('thumb_record')->insert_data($thumbrecorddata);*/ //检查标签变化 //标签数据 $tags = $filemetadata['tags']; $setarr['searchval'] .= implode('', $tags); //现有标签 $tagids = []; //原有标签 $oldtids = []; if ($attrdata['tag']) $oldtids = explode(',', $attrdata['tag']); if (!empty($tags)) { $tagids = $this->addtag($tags); $setarr['tag'] = implode(',', $tagids); } $addtags = array_diff($tagids, $oldtids); $deltags = array_diff($oldtids, $tagids); if (!empty($deltags)) C::t('pichome_resourcestag')->delete_by_ridtid($rid, $deltags); foreach ($addtags as $tid) { $rtag = ['appid' => $this->appid, 'rid' => $rid, 'tid' => $tid]; C::t('pichome_resourcestag')->insert($rtag); } //检查标注变化 if (isset($filemetadata['comments'])) { $cids = []; foreach ($filemetadata['comments'] as $commentval) { $tcommentval['id'] = $commentval['id'] . $this->appid; $tcommentval['appid'] = $this->appid; $tcommentval['rid'] = $rid; $tcommentval['x'] = number_format($commentval['x'], 2); $tcommentval['y'] = number_format($commentval['y'], 2); $tcommentval['width'] = $commentval['width']; $tcommentval['height'] = $commentval['height']; $tcommentval['annotation'] = $commentval['annotation']; $tcommentval['lastModified'] = $commentval['lastModified']; try { C::t('pichome_comments')->insert($tcommentval); $setarr['searchval'] .= $tcommentval['annotation']; } catch (Exception $e) { } $cids[] = $tcommentval['id']; unset($tcommentval); } $ocids = C::t('pichome_comments')->fetch_id_by_rid($rid); $delcids = array_diff($ocids, $cids); if (!empty($delcids)) C::t('pichome_comments')->delete($delcids); } else { C::t('pichome_comments')->delete_by_rid($rid); } $rfids = []; $orfids = C::t('pichome_folderresources')->fetch_id_by_rid($rid); C::t('pichome_folderresources')->delete($orfids); $setarr['searchval'] .= $resourcesarr['name']; //检查目录变化 foreach ($realfids as $fv) { $fid = $fv; if (!C::t('pichome_folder')->check_password_byfid($fid)) { $frsetarr = ['appid' => $this->appid, 'rid' => $rid, 'fid' => $fid]; C::t('pichome_folderresources')->insert($frsetarr); // $fids[] = $fid; } } //尝试更新属性表数据 $setarr['link'] = $filemetadata['url'] ? trim($filemetadata['url']) : ''; //描述数据 $setarr['desc'] = $filemetadata['annotation'] ? $filemetadata['annotation'] : ''; $setarr['searchval'] .= getstr($setarr['desc'],255) . $setarr['link']; if ($filemetadata['duration']) $setarr['duration'] = number_format($filemetadata['duration'], 2); $setarr['rid'] = $rid; C::t('pichome_resources_attr')->insert($setarr); unset($filemetadata); unset($setarr); } } } } else { if (!$rdata) { $setarr = [ 'appid' => $this->appid, 'rid' => $rid, 'eid' => $id, 'dateline' => $flastdate ]; C::t('#eagle#eagle_record')->insert($setarr); } } } else { $realfolderdata = []; if (!empty($filemetadata['folders'])) { $realfolderdata = C::t('#eagle#eagle_folderrecord')->fetch_fid_by_efid($filemetadata['folders'], $this->appid); } $currentperm = (!empty($realfolderdata)) ? max($realfolderdata) : $this->defaultperm; $realfids = array_keys($realfolderdata); if (!empty($realfids)) { //如果目录含有密码则不导入数据直接跳过 $haspassword = C::t('pichome_folder')->check_haspasswrod($realfids, $this->appid); } else { $haspassword = false; } if (!$haspassword) { $filemetadataname = ($this->iscloud) ? $filemetadata['name'] : $this->getFileRealFileName($tmppath, $filemetadata['name'], $filemetadata['ext']); $filename = $filemetadataname . '.' . $filemetadata['ext']; $thumbname = $filemetadataname . '_thumbnail.png'; $file = ($this->iscloud) ? $tmppath . '/' . $filename : $tmppath . BS . $filename; $thumbfile = ($this->iscloud) ? $tmppath . '/' . $thumbname : $tmppath . BS . $thumbname; $filemetadata['filename'] = $filemetadata['name']; $filemetadata['file'] = $file; unset($file); $filemetadata['thumbfile'] = $thumbfile; $filemetadata['folders'] = $realfids; $filemetadata['level'] = $currentperm; unset($thumbfile); $filemetadata['rid'] = $this->createrid(); $filemetadata['mtime'] = $filemetadata['mtime'] ? $filemetadata['mtime'] : $filemetadata['modificationTime']; $filemetadata['btime'] = $filemetadata['btime'] ? $filemetadata['btime'] : $filemetadata['modificationTime']; $filemetadata['dateline'] = $filemetadata['lastModified']; $filemetadata['lastdate'] = $flastdate; $this->exportfile($id, $filemetadata); unset($filemetadata); } } } } else { //如果已有数据删除,否则不做处理 if (!$rid) C::t('pichome_resources')->delete_by_rid($rid); } $this->donum += 1; $percent = floor(($this->donum / $this->filenum) * 100); //防止因获取文件总个数不准确百分比溢出 $percent = ($percent > 100) ? 100 : $percent; C::t('pichome_vapp')->update($this->appid, array( 'percent' => $percent, 'donum' => $this->donum, 'state' =>2, 'filenum' => $this->filenum)); } } } if ($returndata['IsTruncated']) { $lastid = $returndata['NextMarker']; $state = 2; } else { $state = 3; } C::t('pichome_vapp')->update($this->appid, array('lastid' => $lastid, 'percent' => $percent, 'donum' => $this->donum, 'state' => $state, 'filenum' => $this->filenum)); return array('success' => true); } //校验文件 public function execCheckFile() { if ($this->exportstatus == 3) { $total = DB::result_first("select count(rid) from %t where appid = %s ", array('pichome_resources', $this->appid)); //校验文件 $this->check_file($total); } return true; } public function check_file($total) { if ($this->lastid < 1) $this->lastid = 1; $limitsql = ($this->lastid - 1) * $this->checklimit . ',' . $this->checklimit; $delrids = []; $data = DB::fetch_all("select rid,isdelete from %t where appid = %s order by lastdate asc limit $limitsql ", array('pichome_resources', $this->appid)); if (empty($data)) { C::t('pichome_vapp')->update($this->appid, array('percent' => 0, 'state' => 4, 'lastid' => 0, 'donum' => 0)); //校验完成后更新目录文件数 foreach (DB::fetch_all("select count(rf.id) as num,f.fid from %t f left join %t rf on rf.fid=f.fid where f.appid = %s group by f.fid", array('pichome_folder', 'pichome_folderresources', $this->appid)) as $v) { C::t('pichome_folder')->update($v['fid'], array('filenum' => $v['num'])); } //修正库中文件数 $total = DB::result_first("select count(rid) from %t where appid = %s ", array('pichome_resources', $this->appid)); $hascatnum = DB::result_first("SELECT count(DISTINCT rid) FROM %t where appid = %s", array('pichome_folderresources', $this->appid)); $nosubfilenum = $total - $hascatnum; C::t('pichome_vapp')->update($this->appid, array('filenum' => $total, 'nosubfilenum' => $nosubfilenum)); return true; } foreach ($data as $v) { if (dzz_process::getlocked($this->processname)) exit('vapp isdeleted'); if ($v['isdelete']) { $delrids[] = $v['rid']; } else { $id = C::t('#eagle#eagle_record')->fetch_eid_by_rid($v['rid'], $this->appid); if (!$id) { $delrids[] = $v['rid']; } else { $filejson = ($this->iscloud) ? $this->path . '/images/' . $id . '.info/metadata.json' : $this->path . BS . 'images' . BS . $id . '.info' . BS . 'metadata.json'; if (!IO::checkfileexists($filejson)) { $delrids[] = $v['rid']; } } } } if (!empty($delrids)) { //如果有需要删除的,删除后,则重新查询上一页数据 C::t('pichome_resources')->delete_by_rid($delrids); if ($this->lastid == 1) { $percent = round(($this->checklimit / $total) * 100); } else { $percent = round((($this->lastid - 1) * $this->checklimit / $total) * 100); } C::t('pichome_vapp')->update($this->appid, array('lastid' => $this->lastid, 'percent' => $percent, 'state' => 3)); } else { if ($this->lastid == 1) { $percent = round(($this->checklimit / $total) * 100); } else { $percent = round((($this->lastid - 1) * $this->checklimit / $total) * 100); } $percent = ($percent > 100) ? 100 : $percent; C::t('pichome_vapp')->update($this->appid, array('lastid' => $this->lastid + 1, 'percent' => $percent, 'state' => 3)); } } public function exportfile($id, $filemetadata) { $rid = $filemetadata['rid']; if (!IO::checkfileexists($filemetadata['file'])) { return; } if (dzz_process::getlocked($this->processname)) exit('vapp isdeleted'); //$filemetadata['file'] = ($this->iscloud) ? str_replace(BS, '/', $filemetadata['file']):str_replace('/', BS, $filemetadata['file']); $attachment = ($this->iscloud) ? str_replace(BS, '/', $filemetadata['file']) : str_replace('/', BS, $filemetadata['file']); $path = ($this->iscloud) ? str_replace($this->path . '/', '', $attachment) : str_replace($this->path . BS, '', $attachment); unset($attachment); $thumb = IO::checkfileexists($filemetadata['thumbfile']) ? 1 : 0; $filemetadata['thumbfile'] = str_replace(array(DZZ_ROOT, BS), array('', '/'), $filemetadata['thumbfile']); $type = getTypeByExt($filemetadata['ext']); $resourcesarr = [ 'rid' => $rid, 'uid' => $this->uid, 'username' => $this->username, 'appid' => $this->appid, 'width' => $filemetadata['width'] ? $filemetadata['width'] : 0, 'height' => $filemetadata['height'] ? $filemetadata['height'] : 0, 'name' => $filemetadata['filename'] . '.' . $filemetadata['ext'], 'ext' => $filemetadata['ext'], 'size' => $filemetadata['size'], 'dateline' => $filemetadata['dateline'], 'btime' => $filemetadata['btime'], 'mtime' => $filemetadata['mtime'], 'isdelete' => $filemetadata['isDeleted'], 'hasthumb' => $thumb, 'grade' => $filemetadata['star'] ? intval($filemetadata['star']) : 0, 'type' => $type, 'lastdate' => $filemetadata['lastdate'], 'fids' => implode(',', $filemetadata['folders']), 'level' => $filemetadata['level'] ]; unset($type); //插入文件表数据 if (C::t('#eagle#eagle_record')->insert_data($id, $resourcesarr)) { /* $thumbrecorddata = [ 'rid'=>$rid, 'ext'=>$filemetadata['ext'] ]; if($resourcesarr['hasthumb']){ $imgdata = @getimagesize($filemetadata['thumbfile']); $swidth = isset($imgdata[0]) ? $imgdata[0] : 0; $sheight = isset($imgdata[1]) ? $imgdata[1] : 0; $thumbrecorddata['spath'] = $filemetadata['thumbfile']; $thumbrecorddata['sstatus'] = 1; $thumbrecorddata['swidth'] = $swidth; $thumbrecorddata['sheight'] = $sheight; } C::t('thumb_record')->insert_data($thumbrecorddata);*/ DB::delete('pichome_folderresources', array('rid' => $rid)); //获取属性表数据 $setarr = []; $setarr['searchval'] = $resourcesarr['name']; //$fids = []; //插入目录关联表数据 foreach ($filemetadata['folders'] as $fv) { $fid = $fv; if (!C::t('pichome_folder')->check_password_byfid($fid)) { $frsetarr = ['appid' => $this->appid, 'rid' => $rid, 'fid' => $fid]; C::t('pichome_folderresources')->insert($frsetarr); //$fids[] = $fid; unset($frsetarr); } } /* if(!empty($fids)){ foreach(DB::fetch_all("select fname from %t where fid in(%n)",array('pichome_folder',$fids)) as $foldername){ $setarr['searchval'] .= $foldername['fname']; } }*/ //标签数据 $tags = $filemetadata['tags']; $setarr['searchval'] .= implode('', $tags); if (!empty($tags)) { $tagids = $this->addtag($tags); unset($tags); foreach ($tagids as $tid) { $rtag = ['appid' => $this->appid, 'rid' => $rid, 'tid' => $tid]; C::t('pichome_resourcestag')->insert($rtag); } $setarr['tag'] = implode(',', $tagids); unset($tagids); } //颜色数据 if (isset($filemetadata['palettes'])) { $returndata = $this->getColor($filemetadata['palettes'], $resourcesarr['width'], $resourcesarr['height'], $rid); $setarr['colors'] = $returndata['colors']; $setarr['gray'] = $returndata['gray']; $setarr['shape'] = $returndata['shape']; unset($returndata); } //标注数据 if (isset($filemetadata['comments'])) { foreach ($filemetadata['comments'] as $commentval) { $tcommentval['id'] = $commentval['id'] . $this->appid; $tcommentval['appid'] = $this->appid; $tcommentval['rid'] = $rid; $tcommentval['x'] = number_format($commentval['x'], 2); $tcommentval['y'] = number_format($commentval['y'], 2); $tcommentval['width'] = $commentval['width']; $tcommentval['height'] = $commentval['height']; $tcommentval['annotation'] = $commentval['annotation']; $tcommentval['lastModified'] = $commentval['lastModified']; C::t('pichome_comments')->insert($tcommentval); $setarr['searchval'] .= $commentval['annotation']; unset($tcommentval); } } //时长 if ($filemetadata['duration']) $setarr['duration'] = number_format($filemetadata['duration'], 2); //链接数据 $setarr['link'] = $filemetadata['url'] ? trim($filemetadata['url']) : ''; //描述数据 $setarr['desc'] = $filemetadata['annotation'] ? $filemetadata['annotation'] : ''; $setarr['searchval'] .= getstr($setarr['desc'],255) . $setarr['link']; $setarr['rid'] = $rid; $setarr['appid'] = $this->appid; $setarr['path'] = $path; //echo '属性插入前缓存:'.memory_get_usage()/1024 . '
'; //插入数据 C::t('pichome_resources_attr')->insert($setarr); //echo '属性插入后缓存:'.memory_get_usage()/1024 . '
'; } else { runlog('eagleexport', $rid); } } //判断图片纯色 public function isgray($colors) { $i = 0; if (count($colors) < 1) return 0; foreach ($colors as $color) { $color = new Color($color); $rgb = $color->toRGB(); unset($color); if (abs($rgb[0] - $rgb[1]) < 10 && abs($rgb[2] - $rgb[1]) < 10) { $i++; } unset($rgb); } if ($i == count($colors)) { return 1; } else { return 0; } } //获取颜色数据 public function getColor($colors, $width, $height, $rid) { //echo '颜色处理前:'.memory_get_usage()/1024 . '
'; $intcolorsarr = $palettesnum = $returndata = []; $i = 1; foreach ($colors as $c) { $color = new \Color($c['color']); //获取颜色整型值 $intcolor = $color->toInt(); $intcolorsarr[] = $intcolor; $palettesnum[] = $p = $this->getPaletteNumber($intcolor); $palattedataarr = ['rid' => $rid, 'color' => $intcolor, 'weight' => $c['ratio'], 'r' => $c['color'][0], 'g' => $c['color'][1], 'b' => $c['color'][2], 'p' => $p]; C::t('pichome_palette')->insert($palattedataarr); $i++; } unset($colors); //颜色整型值数据 $returndata['colors'] = implode(',', $palettesnum); $returndata['gray'] = $this->isgray($intcolorsarr); $returndata['shape'] = round(($width / $height) * 100); unset($intcolorsarr); return $returndata; } public function getPaletteNumber($colors, $palette = array()) { if (empty($palette)) $palette = $this->palette; $arr = array(); if (is_array($colors)) { $isarray = 1; } else { $colors = (array)$colors; $isarray = 0; } foreach ($colors as $color) { $bestColor = 0x000000; $bestDiff = PHP_INT_MAX; $color = new Color($color); foreach ($palette as $key => $wlColor) { // calculate difference (don't sqrt) $diff = $color->getDiff($wlColor); // see if we got a new best if ($diff < $bestDiff) { $bestDiff = $diff; $bestColor = $wlColor; } } unset($color); $arr[] = array_search($bestColor, $palette); } return $isarray ? $arr : $arr[0]; } //添加标签 public function addtag($tags) { $tagids = []; foreach ($tags as $v) { if (!preg_match('/^\s*$/', $v)) { if ($tid = C::t('pichome_tag')->insert($v)) { $tagids[] = $tid; } } } unset($tags); return $tagids; } }