fetch($rid); switch ($by) { case 'name': $orderby = 'name'; break; case 'size': $orderby = 'size'; break; case 'type': $orderby = array('type', 'ext'); break; case 'time': $orderby = 'dateline'; break; } if ($limit) list($start, $perpage) = explode('-', $limit); foreach (C::t('resources')->fetch_all_by_pfid($icoarr['oid'], '', $perpage, $by, $asc, $start) as $value) { $data[$value['rid']] = $value; } return $data; } /** * 获取空间配额信息 * @return string */ public function MoveToSpace($path, $attach = array()) { global $_G; $obz = io_remote::getBzByRemoteid($attach['remote']); if ($obz == 'dzz') { return array('error' => lang('same_storage_area')); } else { $url = IO::getFileUri($obz . '/' . $attach['attachment']); if (is_array($url)) return array('error' => $url['error']); $target = $_G['setting']['attachdir'] . './' . $attach['attachment']; $targetpath = dirname($target); dmkdir($targetpath); try { if (file_put_contents($target, fopen($url, 'rb')) === false) { return array('error' => lang('error_occurred_written_local')); } } catch (Exception $e) { return array('error' => $e->getMessage()); } if (md5_file($target) != $attach['md5']) { return array('error' => lang('file_transfer_errors')); } } return true; } public function rename($rid, $text) { //查找当前目录下是否有同名文件 $icoarr = C::t('resources')->fetch_info_by_rid($rid); $ext = ''; $namearr = explode('.', $text); if (count($namearr) > 1) { $ext = $namearr[count($namearr) - 1]; unset($namearr[count($namearr) - 1]); $ext = $ext ? ('.' . $ext) : ''; } $tname = implode('.', $namearr); //如果有后缀名并且是文件 if ($ext && $icoarr['ext']) { //如果后缀名和原后缀名不同,则加上原后缀名组成新的文件名 if ($ext != '.' . $icoarr['ext']) { $text = $tname . $ext . '.' . $icoarr['ext']; } else { $text = $tname . $ext; } } elseif (!$ext && $icoarr['ext']) { $text = $tname . $ext . '.' . $icoarr['ext']; } /*$name=preg_replace("/\(\d+\)/i",'',$tname).'('.($i+1).')'.$ext;*/ if ($icoarr['name'] != $text && ($ricoid = io_dzz::getRepeatIDByName($text, $icoarr['pfid'], ($icoarr['type'] == 'folder') ? true : false))) {//如果目录下有同名文件 return array('error' => lang('filename_already_exists')); } if (!$arr = C::t('resources')->rename_by_rid($rid, $text)) { return array('error' => 'Not modified!'); } $icoarr['name'] = $text; return $icoarr; } public function parsePath($path) { return $path; } //根据路径获取目录树的数据; function getFolderDatasByPath($fid) { $fidarr = getTopFid($fid); $folderarr = array(); foreach ($fidarr as $fid) { $folderarr[$fid] = C::t('folder')->fetch_by_fid($fid); } return $folderarr; } //获取文件流地址 public function getStream($path, $fop = '') { global $_G;//123 if (strpos($path, 'attach::') === 0) { $attach = C::t('attachment')->fetch(intval(str_replace('attach::', '', $path))); Hook::listen('io_dzz_getstream_attach',$attach);//挂载点 $bz = io_remote::getBzByRemoteid($attach['remote']); if ($bz == 'dzz') { return $_G['setting']['attachdir'] . $attach['attachment']; } else { return IO::getStream($bz . '/' . $attach['attachment'], $fop); } } elseif (strpos($path, 'dzz::') === 0) { if (strpos($path, '../') !== false) return ''; return $_G['setting']['attachdir'] . preg_replace("/^dzz::/", '', $path); } elseif (strpos($path, 'TMP::') === 0) { $tmp = str_replace('\\', '/', sys_get_temp_dir()); return str_replace('TMP::', $tmp . '/', $path); } elseif (preg_match('/\w{32}/i', $path)) { $icoid = trim($path); $icoarr = C::t('resources')->fetch_by_rid($path); Hook::listen('io_dzz_getstream_attach',$icoarr);//挂载点 $bz = io_remote::getBzByRemoteid($icoarr['remote']); if ($bz == 'dzz') { if ($icoarr['type'] == 'video' || $icoarr['type'] == 'link') { return $icoarr['url']; } return $_G['setting']['attachdir'] . $icoarr['attachment']; } else { return IO::getStream($bz . '/' . $icoarr['attachment'], $fop); } } elseif (preg_match('/^dzz:[gu]id_\d+:.+?/i', $path)) { $dir = dirname($path) . '/'; if (!$pfid = C::t('resources_path')->fetch_fid_bypath($dir)) { return false; } $filename = preg_replace('/^.+[\\\\\\/]/', '', $path); //$filename = basename($path); if (!$rid = DB::result_first("select rid from %t where pfid = %d and name = %s", array('resources', $pfid, $filename))) { return false; } $icoarr = C::t('resources')->fetch_by_rid($rid); Hook::listen('io_dzz_getstream_attach',$icoarr);//挂载点 $bz = io_remote::getBzByRemoteid($icoarr['remote']); if ($bz == 'dzz') { if ($icoarr['type'] == 'video' || $icoarr['type'] == 'link') { return $icoarr['url']; } return $_G['setting']['attachdir'] . $icoarr['attachment']; } else { return IO::getStream($bz . '/' . $icoarr['attachment'], $fop); } } else { return $path; } return ''; } //获取文件的真实地址 public function getFileUri($path, $fop = '') { global $_G; if (strpos($path, 'attach::') === 0) { $attach = C::t('attachment')->fetch(intval(str_replace('attach::', '', $path))); Hook::listen('io_dzz_getstream_attach',$attach);//挂载点 $bz = io_remote::getBzByRemoteid($attach['remote']); if ($bz == 'dzz') { return $_G['siteurl'] . $_G['setting']['attachurl'] . $attach['attachment']; } else { return IO::getFileUri($bz . '/' . $attach['attachment'], $fop); } } elseif (strpos($path, 'dzz::') === 0) { if (strpos($path, './') !== false) return ''; return $_G['siteurl'] . $_G['setting']['attachurl'] . preg_replace("/^dzz::/", '', $path); } elseif (strpos($path, 'TMP::') === 0) { return $_G['siteurl'] . 'index.php?mod=io&op=getStream&path=' . dzzencode($path); } else { $icoarr = C::t('resources')->fetch_by_rid($path); if ($icoarr['aid']) { $attachment = C::t('attachment')->fetch($icoarr['aid']); $icoarr['remote'] = $attachment['remote']; Hook::listen('io_dzz_getstream_attach',$icoarr);//挂载点 $bz = io_remote::getBzByRemoteid($icoarr['remote']); if ($bz == 'dzz') { if ($icoarr['type'] == 'video' || $icoarr['type'] == 'link') { return $icoarr['url']; } return $_G['siteurl'] . $_G['setting']['attachurl'] . $icoarr['attachment']; } else { return IO::getFileUri($bz . '/' . $icoarr['attachment'], $fop); } } else { //待修改 return $_G['siteurl'] . $icoarr['url']; } } return ''; } //获取文件内容 public function getFileContent($path) { $url = self::getStream($path); return file_get_contents($url); } public function deleteThumb($path, $width = 0, $height = 0) { global $_G; $data = IO::getMeta($path); $imgcachePath = './imgcache/'; $cachepath = str_replace('//', '/', str_replace(':', '/', $data['attachment'])); foreach ($_G['setting']['thumbsize'] as $value) { $target = $imgcachePath . ($cachepath) . '.' . $value['width'] . '_' . $value['height'] . '_1.jpeg'; $target1 = $imgcachePath . ($cachepath) . '.' . $value['width'] . '_' . $value['height'] . '_2.jpeg'; @unlink($_G['setting']['attachdir'].$target); @unlink($_G['setting']['attachdir'].$target1); } } public function createThumb($path, $size, $width = 0, $height = 0, $thumbtype = 1) { global $_G; if (!$data = IO::getMeta($path)) return false; $imgcachePath = 'imgcache/'; $cachepath = str_replace('//', '/', str_replace(':', '/', $data['attachment'] ? $data['attachment'] : $data['path'])); $target = $imgcachePath . ($cachepath) . '.' . $width . '_' . $height . '_'.$thumbtype.'.jpeg'; if (@getimagesize($_G['setting']['attachdir'] . './' . $target)) { return 2;//已经存在缩略图 } $fileurls = array(); Hook::listen('thumbnail', $fileurls, $path);//生成缩略图绝对和相对地址; if (!$fileurls) { $fileurls = array('fileurl' => self::getFileUri($path), 'filedir' => self::getStream($path)); } $filepath = $fileurls['filedir']; if (intval($width) < 1) $width = $_G['setting']['thumbsize'][$size]['width']; if (intval($height) < 1) $height = $_G['setting']['thumbsize'][$size]['height']; if (!$imginfo = @getimagesize($filepath)) { return -1; //非图片不能生成 } if (($imginfo[0] < $width && $imginfo[1] < $height)) { return 3;//小于要求尺寸,不需要生成 } //生成缩略图 include_once libfile('class/image'); $target_attach = $_G['setting']['attachdir'] . './' . $target; $targetpath = dirname($target_attach); dmkdir($targetpath); $image = new image(); //Thumb($source, $target, $thumbwidth, $thumbheight, $thumbtype = 1, $nosuffix = 0) //Cropper($source, $target, $dstwidth, $dstheight, $srcx = 0, $srcy = 0, $srcwidth = 0, $srcheight = 0) if ($thumb = $image->Thumb($filepath, $target, $width, $height, $thumbtype) ) { return 1;//生成缩略图成功 } else { return 0;//生成缩略图失败 } } //获取缩略图 public function getThumb($path, $width = 0, $height = 0, $original = false, $returnurl = false, $thumbtype = 1) { global $_G; //$path:可能的值 icoid,'dzz::dzz/201401/02/wrwsdfsdfasdsf.txt'等dzzPath格式; if (!$data = IO::getMeta($path)) return false; $enable_cache = true; //是否启用缓存 $quality = 80; $imgcachePath = 'imgcache/'; $cachepath = str_replace('//', '/', str_replace(':', '/', $data['attachment'] ? $data['attachment'] : $data['path'])); $target = $imgcachePath . ($cachepath) . '.' . $width . '_' . $height . '_'.$thumbtype.'.jpeg'; if (!$original && $enable_cache && @getimagesize($_G['setting']['attachdir'] . './' . $target)) { if ($returnurl) return $_G['setting']['attachurl'] . '/' . $target; $file = $_G['setting']['attachdir'] . './' . $target; IO::output_thumb($file); } $fileurls = array(); Hook::listen('thumbnail', $fileurls, $path);//调用挂载点程序生成缩略图绝对和相对地址; if (!$fileurls) { $fileurls = array('fileurl' => self::getFileUri($path), 'filedir' => self::getStream($path)); } //非图片类文件的时候,直接获取文件后缀对应的图片 if (!$imginfo = @getimagesize($fileurls['filedir'])) { $imgurl = geticonfromext($data['ext'], $data['type']); if ($returnurl) return $imgurl;//$_G['setting']['attachurl'].'./'.$data['attachment']; $file = $imgurl;//$_G['setting']['attachdir'].'./'.$data['attachment']; IO::output_thumb($file); } //返回原图的时候 if ($original) { if ($returnurl) return $fileurls['fileurl'];//$_G['setting']['attachurl'].'./'.$data['attachment']; $file = $fileurls['filedir'];//$_G['setting']['attachdir'].'./'.$data['attachment']; IO::output_thumb($file); } //图片小于缩略图宽高的不生成直接返回原图 if (($imginfo[0] < $width && $imginfo[1] < $height)) { if ($returnurl) return $fileurls['fileurl']; $file = $fileurls['filedir'];//$_G['setting']['attachdir'].'./'.$data['attachment']; IO::output_thumb($file); } //生成缩略图 include_once libfile('class/image'); $target_attach = $_G['setting']['attachdir'] . './' . $target; $targetpath = dirname($target_attach); dmkdir($targetpath); $filepath = $fileurls['filedir']; $image = new image(); if ($thumb = $image->Thumb($filepath, $target, $width, $height, $thumbtype)) { //if ($thumb = $image->Thumb($file, $target, $width, $height, 1)) { if ($returnurl) return $_G['setting']['attachurl'] . '/' . $target; $file = $target_attach; IO::output_thumb($file); } else { if ($returnurl) return $fileurls['fileurl']; $file = $fileurls['filedir']; IO::output_thumb($file); } exit(); } /*//将文件内容保存成文件,放入附件表 private function saveFilecontentToAttach($icoarr,$filecontent){ global $_G; //保存的文件名 $filename = $icoarr['name']; $pathinfo = pathinfo($filename); //获取后缀名 $ext = strtolower($pathinfo['extension']); //生成路径 $target = $this->getPath($ext ? ('.' . $ext) : '', 'dzz'); if (!empty($fileContent) && !file_put_contents($_G['setting']['attachdir'] . $target, $fileContent)) { return array('error' => lang('cache_file_error')); } //判断空间大小 $gid = DB::result_first("select gid from %t where fid=%d", array('folder', $icoarr['pfid'])); if (!SpaceSize(filesize($_G['setting']['attachdir'] . $target), $gid)) { @unlink($_G['setting']['attachdir'] . $target); return array('error' => lang('inadequate_capacity_space')); } //保存到附件表 if ($attach = $this->save($target, $filename)) { return $attach; } else { return array('error' => 'Could not save uploaded file. The upload was cancelled, or server error encountered'); } }*/ /* //将文件内容作为新版本保存(用于保存时,选择文件覆盖的情形) private function coverFilebynewVersion($attach, $icoarr) { global $_G; $setting = $_G['setting']; //当前文件版本数量 $versionnum = DB::result_first("select count(*) from %t where rid = %s", array('resources_version', $icoarr['rid'])); // //版本开启 $vperm = (!isset($setting['fileVersion']) || $setting['fileVersion']) ? true : false; //版本数量限制 $vnumlimit = isset($setting['fileVersionNumber']) ? intval($setting['fileVersionNumber']) : 0; $covertype = 0; //当上传版本开启,上传版本数量不限制;或者上传版本开启,文件版本数量未达到上限:设置当前文件为最新版本 if ($vperm && (!$vnumlimit || ($vnumlimit && ($versionnum < $vnumlimit)))) { $covertype = 1; //当上传版本关闭,并且文件包含版本;或者上传版本开启,并且版本数量达到上限:剔除最老版本,并设置新文件为主版本 } elseif ((!$vperm && $versionnum > 0) || ($vperm && $vnumlimit && $versionnum > $vnumlimit)) { $covertype = 2; //当上传版本关闭,且当前文件不含有版本:替换当前文件 } elseif (!$vperm && !$versionnum) { $covertype = 3; } if ($covertype == 1) { $setarr = array( 'uid' => $_G['uid'], 'username' => $_G['username'], 'name' => $attach['filename'], 'aid' => $attach['aid'], 'size' => $attach['filesize'], 'ext' => $attach['filetype'], 'dateline' => TIMESTAMP ); $return = C::t('resources_version')->add_new_version_by_rid($icoarr['rid'], $setarr); } elseif ($covertype == 2) { $setarr = array( 'uid' => $_G['uid'], 'username' => $_G['username'], 'name' => $attach['filename'], 'aid' => $attach['aid'], 'size' => $attach['filesize'], 'ext' => $attach['filetype'], 'dateline' => TIMESTAMP ); $return = C::t('resources_version')->add_new_version_by_rid($icoarr['rid'], $setarr); $vid = DB::result_first("select min(dateline),vid from %t where rid = %s ", array('resources_version', $icoarr['rid'])); C::t('rescources_version')->delete_by_vid($vid, $icoarr['rid']); } elseif ($covertype == 3) { } }*/ //@param number $rid 文件的rid //@param string $message 文件的新内容 public function setFileContent($rid, $fileContent, $force = false, $nocover = true) { global $_G; if (!$icoarr = C::t('resources')->fetch_by_rid($rid)) { return array('error' => lang('file_not_exist')); } if ($icoarr['type'] != 'document' && $icoarr['type'] != 'attach' && $icoarr['type'] != 'image') { return array('error' => lang('no_privilege')); } $gid = DB::result_first("select gid from %t where fid=%d", array('folder', $icoarr['pfid'])); if (!$force && !perm_check::checkperm('edit', $icoarr)) { return array('error' => lang('no_privilege')); } if (!$attach = getTxtAttachByMd5($fileContent, $icoarr['name'], $icoarr['ext'])) { return array('error' => lang('file_save_failure')); } $covertype = 0; if ($nocover) {//判断是否是覆盖 $setting = $_G['setting']; //当前文件版本数量 $versionnum = DB::result_first("select count(*) from %t where rid = %s", array('resources_version', $icoarr['rid'])); // //版本开启 $vperm = (!isset($setting['fileVersion']) || $setting['fileVersion']) ? true : false; //版本数量限制 $vnumlimit = isset($setting['fileVersionNumber']) ? intval($setting['fileVersionNumber']) : 0; //当上传版本开启,上传版本数量不限制;或者上传版本开启,文件版本数量未达到上限:设置当前文件为最新版本 if ($vperm && (!$vnumlimit || ($vnumlimit && ($versionnum < $vnumlimit)))) { $covertype = 1; //当上传版本关闭,并且文件包含版本;或者上传版本开启,并且版本数量达到上限:剔除最老版本,并设置新文件为主版本 } elseif ((!$vperm && $versionnum > 0) || ($vperm && $vnumlimit && $versionnum >= $vnumlimit)) { $covertype = 2; //当上传版本关闭,且当前文件不含有版本:替换当前文件 } elseif (!$vperm && !$versionnum) { $covertype = 0; } } if ($covertype) { if($covertype == 2){ $vinfo = DB::fetch_first("select min(dateline),vid from %t where rid = %s ", array('resources_version', $icoarr['rid'])); C::t('resources_version')->delete_by_vid($vinfo['vid'], $icoarr['rid']); } $setarr = array( 'uid' => $_G['uid'], 'username' => $_G['username'], 'name' => $icoarr['name'], 'aid' => $attach['aid'], 'size' => $attach['filesize'], 'ext' => $attach['filetype'], 'dateline' => TIMESTAMP ); $return = C::t('resources_version')->add_new_version_by_rid($icoarr['rid'], $setarr,$force); if($return['error']){ return array('error'=>$return['error']); } } else { //计算用户新的空间大小 $csize = $attach['filesize'] - $icoarr['size']; //重新计算用户空间 if ($csize) { if (!SpaceSize($csize, $gid, 0, $icoarr['uid'])) { return array('error' => lang('inadequate_capacity_space')); } SpaceSize($csize, $gid, 1, $icoarr['uid']); } $oldaid = $icoarr['aid']; //更新附件数量 if ($oldaid != $attach['aid']) { C::t('resources')->update_by_rid($rid, array('size' => $attach['filesize'])); C::t('resources_statis')->add_statis_by_rid($rid, array('editdateline' => TIMESTAMP)); C::t('resources_attr')->update_by_skey($icoarr['rid'], $icoarr['vid'], array('aid' => $attach['aid'])); C::t('attachment')->update($attach['aid'], array('copys' => $attach['copys'] + 1)); C::t('attachment')->delete_by_aid($oldaid); } $path = C::t('resources_path')->fetch_pathby_pfid($icoarr['pfid']); $path = preg_replace('/dzz:(.+?):/', '', $path) ? preg_replace('/dzz:(.+?):/', '', $path) : ''; $hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($icoarr['pfid'], $icoarr['gid']); $eventdata = array( 'title' => $icoarr['name'], 'aid' => $icoarr['aid'], 'username' => $_G['username'], 'uid' => $_G['uid'], 'path' => $icoarr['path'], 'position' => $path, 'hash' => $hash ); $event = 'edit_file'; C::t('resources_event')->addevent_by_pfid($icoarr['pfid'], $event, 'edit', $eventdata, $icoarr['gid'], $icoarr['rid'], $icoarr['name']); } return C::t('resources')->fetch_by_rid($rid); } //查找目录下的同名文件 //@param string $filename 文件名称 //@param number $fid 目录id //@param bool $isfolder 查找同名目录 //return icoid 返回icoid public function getRepeatIDByName($filename, $fid, $isfolder = false) { $sql = "pfid=%d and name=%s and isdelete<1"; if ($isfolder) $sql .= " and type='folder'"; else $sql .= " and type!='folder'"; if ($rid = DB::result_first("select rid from %t where $sql ", array('resources', $fid, $filename))) { return $rid; } else return false; } //获取icosdata public function getMeta($icoid) { if (strpos($icoid, 'dzz::') === 0) { $attachment = preg_replace('/^dzz::/i', '', $icoid); $name = array_pop(explode('/', $icoid)); $ext = array_pop(explode('.', $name)); return array('icoid' => $icoid, 'name' => $name, 'ext' => $ext, 'size' => filesize(getglobal('setting/attachdir') . $attachment), 'url' => getglobal('setting/attachurl') . $attachment, 'path' => $icoid, 'md5' => md5_file(getglobal('setting/attachdir') . $attachment), 'attachment' => $attachment, 'dpath' => dzzencode($icoid), 'sperm' => perm_FileSPerm::typePower('attachment'), 'bz'=>'' ); } elseif (strpos($icoid, 'attach::') === 0) { $attach = C::t('attachment')->fetch(intval(str_replace('attach::', '', $icoid))); $bz = io_remote::getBzByRemoteid($attach['remote']); if ($bz == 'dzz') { return array('icoid' => $icoid, 'name' => $attach['filename'], 'ext' => $attach['filetype'], 'apath' => dzzencode('attach::' . $attach['aid']), 'dpath' => dzzencode('attach::' . $attach['aid']), 'path' => 'attach::' . $attach['aid'], 'attachment' => $attach['attachment'], 'size' => $attach['filesize'], 'url' => getAttachUrl($attach), 'md5' => $attach['md5'], 'bz' => '', 'sperm' => perm_FileSPerm::typePower('attachment') ); } else { $path = $bz.'/'.$attach['attachment']; return IO::getMeta($path); } } elseif (strpos($icoid, 'TMP::') === 0) { $file = self::getStream($icoid); $attachment = preg_replace('/^TMP::/i', '', $icoid); $pathinfo = pathinfo($file); return array('icoid' => md5($icoid), 'name' => $pathinfo['basename'], 'ext' => $pathinfo['extension'], 'size' => filesize($file), 'path' => $icoid, 'dpath' => dzzencode($icoid), 'url' => '', 'bz' => '' ); } elseif (preg_match('/^dzz:[gu]id_\d+:.+?/i', $icoid)) { $dir = dirname($icoid) . '/'; if (!$pfid = C::t('resources_path')->fetch_fid_bypath($dir)) { return false; } $filename = basename($icoid); if (!$rid = DB::result_first("select rid from %t where pfid = %d and name = %s", array('resources', $pfid, $filename))) { return false; } return C::t('resources')->fetch_by_rid($rid); } elseif (preg_match('/\w{32}/i', $icoid)) { return C::t('resources')->fetch_by_rid($icoid); } else { return false;//C::t('resources')->fetch_by_icoid($icoid); } } public function getFolderByIcosdata($data) { if ($data['type'] == 'folder') { return C::t('folder')->fetch_by_fid($data['oid']); } return array(); } //打包下载文件 public function zipdownload($paths, $filename = '',$checkperm = true) { global $_G; $paths = (array)$paths; set_time_limit(0); if (empty($filename)) { $meta = self::getMeta($paths[0]); $filename = $meta['name'] . (count($paths) > 1 ? lang('wait') : ''); } $eventdata = array('username' => getglobal('username'), 'dateline' => TIMESTAMP); $infos = C::t('resources')->fetch_info_by_rid($paths[0]); $path = C::t('resources_path')->fetch_pathby_pfid($infos['pfid']); $hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($infos['pfid'], $infos['gid']); $eventdata['position'] = preg_replace('/dzz:(.+?):/', '', $path); $eventdata['hash'] = $hash; $statisdata = array( 'downs' => 1, ); C::t('resources_statis')->add_statis_by_rid($paths, $statisdata); if (count($paths) > 1) { $filenames = ''; foreach (DB::fetch_all("select name from %t where rid in(%n)", array('resources', $paths)) as $v) { $filenames .= $v['name'] . ','; } $filenames = substr($filenames, 0, -1); $eventdata['files'] = $filenames; C::t('resources_event')->addevent_by_pfid($infos['pfid'], 'downfiles', 'down', $eventdata, $infos['gid'], '', $filenames); } else { $eventdata['files'] = $infos['name']; C::t('resources_event')->addevent_by_pfid($infos['pfid'], 'downfile', 'down', $eventdata, $infos['gid'], $infos['rid'], $infos['name']); } $filename = (strtolower(CHARSET) == 'utf-8' && (strexists($_SERVER['HTTP_USER_AGENT'], 'MSIE') || strexists($_SERVER['HTTP_USER_AGENT'], 'Edge') || strexists($_SERVER['HTTP_USER_AGENT'], 'rv:11')) ? urlencode($filename) : $filename); //$data=self::getFolderInfo($path); include_once libfile('class/ZipStream'); $zip = new ZipStream($filename . ".zip"); $data = self::getFolderInfo($paths, '', $zip,$checkperm); $zip->finalize(); } public function getFolderInfo($paths, $position = '', &$zip,$checkperm = true) { static $data = array(); try { foreach ($paths as $path) { $meta = self::getMeta($path); switch ($meta['type']) { case 'folder': $lposition = $position . $meta['name'] . '/'; $contents = C::t('resources')->fetch_by_pfid($meta['oid'],'',$checkperm); foreach ($contents as $key => $value) { self::getFolderInfo(array($value['rid']), $lposition, $zip); } break; case 'discuss': case 'dzzdoc': case 'shortcut': case 'user': case 'link': case 'music': case 'video': case 'topic': case 'app'://这些内容不能移动到api网盘内; break; default: $meta['url'] = IO::getStream($meta['path']); $meta['position'] = $position . ($meta['ext']?(preg_replace("/\.".$meta['ext']."$/i",'',$meta['name']).'.'.$meta['ext']):$meta['name']); /*$data[$meta['icoid']]=$meta;*/ $zip->addLargeFile(fopen($meta['url'], 'rb'), $meta['position'], $meta['dateline']); } } } catch (Exception $e) { $data['error'] = $e->getMessage(); return $data; } return $data; } //下载 public function download($paths, $filename = '',$checkperm = true) { global $_G; $paths = (array)$paths; if (count($paths) > 1) { self::zipdownload($paths, $filename,$checkperm); exit(); } else { $path = $paths[0]; } @set_time_limit(0); $attachexists = FALSE; if (strpos($path, 'attach::') === 0) { $attachment = C::t('attachment')->fetch(intval(str_replace('attach::', '', $path))); $attachment['name'] = $filename ? $filename : $attachment['filename']; $path = getDzzPath($attachment); $attachurl = IO::getStream($path); } elseif (strpos($path, 'dzz::') === 0) { $attachment = array('attachment' => preg_replace("/^dzz::/i", '', $path), 'name' => $filename ? $filename : substr(strrpos($path, '/'))); $attachurl = $_G['setting']['attachdir'] . $attachment['attachment']; } elseif (strpos($path, 'TMP::') === 0) { $tmp = str_replace('\\', '/', sys_get_temp_dir()); $attachurl = str_replace('TMP::', $tmp . '/', $path); $pathinfo = pathinfo($attachurl); $attachment = array('attachment' => $attachurl, 'name' => $filename ? $filename : $pathinfo['basename']); } elseif (preg_match('/\w{32}/i', $path)) { $icoid = trim($path); $icoarr = C::t('resources')->fetch_by_rid($path); if (!$icoarr['rid']) { topshowmessage(lang('attachment_nonexistence')); } elseif ($icoarr['type'] == 'folder') { self::zipdownload($path,$filename,$checkperm); exit(); } if (!$icoarr['aid']) { topshowmessage(lang('attachment_nonexistence')); } $attachment = $icoarr; $attachurl = IO::getStream($path); //添加事件 if ($attachurl) { $eventdata = array('username' => getglobal('username'), 'dateline' => TIMESTAMP); $infos = C::t('resources')->fetch_info_by_rid($path); $path = C::t('resources_path')->fetch_pathby_pfid($infos['pfid']); $hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($infos['pfid'], $infos['gid']); $eventdata['position'] = $icoarr['relpath']; $eventdata['files'] = $icoarr['name']; $eventdata['hash'] = $hash; $statisdata = array( 'downs' => 1, ); C::t('resources_statis')->add_statis_by_rid($icoarr['rid'], $statisdata); if (!C::t('resources_event')->addevent_by_pfid($icoarr['pfid'], 'downfile', 'down', $eventdata, $icoarr['gid'], $icoarr['rid'], $icoarr['name'])) { return false; } } } elseif (preg_match('/^dzz:[gu]id_\d+:.+?/i', $path)) { $dir = dirname($path) . '/'; if (!$pfid = C::t('resources_path')->fetch_fid_bypath($dir)) { return false; } $filename = preg_replace('/^.+[\\\\\\/]/', '', $path); //如果是文件夹 if (!$filename) { $patharr = preg_split('/[\\\\\\/]/', $path); $patharr = array_filter($patharr); $filename = end($patharr); } if (!$rid = DB::result_first("select rid from %t where pfid = %d and name = %s", array('resources', $pfid, $filename))) { return false; } $icoarr = C::t('resources')->fetch_by_rid($rid); if (!$icoarr['rid']) { topshowmessage(lang('attachment_nonexistence')); } elseif ($icoarr['type'] == 'folder') { self::zipdownload($path, $filename,$checkperm); exit(); } if (!$icoarr['aid']) { topshowmessage(lang('attachment_nonexistence')); } $attachment = $icoarr; $attachurl = IO::getStream($path); //添加事件 if ($attachurl) { $eventdata = array('username' => getglobal('username'), 'dateline' => TIMESTAMP); $infos = C::t('resources')->fetch_info_by_rid($path); $path = C::t('resources_path')->fetch_pathby_pfid($infos['pfid']); $hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($infos['pfid'], $infos['gid']); $eventdata['position'] = $icoarr['relpath']; $eventdata['files'] = $icoarr['name']; $eventdata['hash'] = $icoarr['hash']; $statisdata = array( 'downs' => 1, ); C::t('resources_statis')->add_statis_by_rid($icoarr['rid'], $statisdata); if (!C::t('resources_event')->addevent_by_pfid($icoarr['pfid'], 'downfile', 'down', $eventdata, $icoarr['gid'], $icoarr['rid'], $icoarr['name'])) { return false; } } } $filesize = !$attachment['remote'] ? filesize($attachurl) : $attachment['filesize']; if ($attachment['ext'] && strpos(strtolower($attachment['name']), $attachment['ext']) === false) { $attachment['name'] .= '.' . $attachment['ext']; } $attachment['name'] = '"' . (strtolower(CHARSET) == 'utf-8' && (strexists($_SERVER['HTTP_USER_AGENT'], 'MSIE') || strexists($_SERVER['HTTP_USER_AGENT'], 'Edge') || strexists($_SERVER['HTTP_USER_AGENT'], 'rv:11')) ? urlencode($attachment['name']) : ($attachment['name'])) . '"'; $d = new FileDownload(); $d->download($attachurl, $attachment['name'], $filesize, $attachment['dateline'], true); exit(); } //删除 //当文件在回收站时,彻底删除; //finaldelete 真实删除,不放入回收站 //$force 强制删除,不受权限控制 public function Delete($path,$finaldelete=false, $force = false) { global $_G; if (strpos($path, 'dzz::') === 0) { if (strpos($path, './') !== false) return false; @unlink($_G['setting']['attachdir'] . preg_replace('/^dzz::/i', '', $path)); return true; } elseif (strpos($path, 'attach::') === 0) { if (strpos($path, './') !== false) return false; return C::t('attachment')->delete_by_aid(intval(str_replace('attach::', '', $path))); } elseif (strpos($path, 'TMP::') === 0) { $tmp = str_replace('\\', '/', sys_get_temp_dir()); return @unlink(str_replace('TMP::', $tmp . '/', $path)); } elseif (preg_match('/^dzz:[gu]id_\d+:.+?/i', $path)) { $dir = dirname($path) . '/'; if (!$pfid = C::t('resources_path')->fetch_fid_bypath($dir)) { return false; } $filename = preg_replace('/^.+[\\\\\\/]/', '', $path); //如果是文件夹 if (!$filename) { $patharr = preg_split('/[\\\\\\/]/', $path); $patharr = array_filter($patharr); $filename = end($patharr); } if ($rid = DB::result_first("select rid from %t where pfid = %d and name = %s and isdelete < 1", array('resources', $pfid, $filename))) { $icoarr=C::t('resources')->fetch_by_rid($rid); }else{ return array('rid' => $icoarr['rid'], 'error' => lang('file_longer_exists')); } if ($force || perm_check::checkperm('delete', $icoarr)) { if ($finaldelete) {//强制彻底删除 C::t('resources')->delete_by_rid($path, true); } elseif ($icoarr['isdelete'] > 0) {//删除状态彻底删除 C::t('resources')->delete_by_rid($path, true); } else {//非删除状态删除到回收站 $return = C::t('resources')->recyle_by_rid($icoarr['rid'],$force); if ($return['error']) { return $return; } } } else { return array('rid' => $icoarr['rid'], 'error' => lang('no_privilege')); } return array('rid' => $icoarr['rid'], 'name' => $icoarr['name']); } elseif (preg_match('/\w{32}/i', $path)) {//rid删除 try { if (!$icoarr = C::t('resources')->fetch_by_rid($path)) { return array('rid' => $path, 'error' => lang('file_longer_exists')); } //当文件在回收站时,补全文件的原pfid(通过回收站表) if($icoarr['pfid']=='-1' && ($recycle=C::t('resources_recyle')->fetch_by_rid($path))){ $icoarr['pfid']=$recycle['pfid']; } //文件大小统计改到 resources表中处理 /* $size = 0; if ($icoarr['type'] == 'folder') { $contains = C::t('resources')->get_contains_by_fid($icoarr['oid'], true); $size = $contains['size']; } else { if ($icoarr['vid'] > 0) { $size = DB::result_first("select sum(size) from %t where rid = %s", array('resources_version', $icoarr['rid'])); } else { $size = $icoarr['size']; } }*/ if ($force || perm_check::checkperm('delete', $icoarr)) { if ($finaldelete) {//强制彻底删除 C::t('resources')->delete_by_rid($path, true); } elseif ($icoarr['isdelete'] > 0) {//删除状态彻底删除 C::t('resources')->delete_by_rid($path, true); } else {//非删除状态删除到回收站 $return = C::t('resources')->recyle_by_rid($icoarr['rid'],$force); if ($return['error']) { return $return; } } } else { return array('rid' => $icoarr['rid'], 'error' => lang('no_privilege')); } //文件大小统计改到 resources表中处理 /*if ($size > 0 && !$icoarr['isdelete']) { SpaceSize(-$size, $icoarr['gid'], true); }*/ return array('rid' => $icoarr['rid'], 'name' => $icoarr['name']); } catch (Exception $e) { return array('error' => $e->getMessage()); } } } //检查名称是否重复 public function check_name_repeat($name, $pfid) { return DB::result_first("select rid from " . DB::table('resources') . " where name='{$name}' and pfid='{$pfid}'"); } //过滤文件名称 public function name_filter($name) { return str_replace(array('/', '\\', ':', '*', '?', '<', '>', '|', '"', "\n"), '', $name); } //获取不重复的目录名称 public function getFolderName($name, $pfid) { static $i = 0; $name = self::name_filter($name); //echo("select COUNT(*) from ".DB::table('folder')." where fname='{$name}' and pfid='{$pfid}'"); if (DB::result_first("select COUNT(*) from %t where fname=%s and pfid=%d and isdelete<1", array('folder', $name, $pfid))) { $name = preg_replace("/\(\d+\)/i", '', $name) . '(' . ($i + 1) . ')'; $i += 1; return self::getFolderName($name, $pfid); } else { return $name; } } //获取不重复的文件名称 public function getFileName($name, $pfid) { static $i = 0; $name = self::name_filter($name); //echo("select COUNT(*) from ".DB::table('folder')." where fname='{$name}' and pfid='{$pfid}'"); if (DB::result_first("select COUNT(*) from %t where type!='folder' and name=%s and isdelete<1 and pfid=%d", array('resources', $name, $pfid))) { $ext = ''; $namearr = explode('.', $name); if (count($namearr) > 1) { $ext = $namearr[count($namearr) - 1]; unset($namearr[count($namearr) - 1]); $ext = $ext ? ('.' . $ext) : ''; } $tname = implode('.', $namearr); $name = preg_replace("/\(\d+\)/i", '', $tname) . '(' . ($i + 1) . ')' . $ext; $i += 1; return self::getFileName($name, $pfid); } else { return $name; } } //根据文件名创建顶级目录 public function createTopFolderByFname($fname, $perm = 0, $params = array(), $ondup = 'newcopy') { global $_G; $folderparams = array('innav', 'fsperm', 'disp', 'iconview', 'display', 'flag', 'default','perm'); $data = array(); if (($ondup == 'overwrite') && ($folder = C::t('folder')->fetch_topby_fname($fname))) {//如果目录下有同名目录 $data['folderarr'] = $folder; return $data; } else $fname = self::getFolderName($fname, 0); //重命名 $flag=$params['flag']?$params['flag']:'folder'; if($flag!=='folder') $folder_set=C::t('folder_flag')->fetch($flag); $top = array( 'pfid' => 0, 'uid' => $_G['uid'], 'username' => $_G['username'], 'perm' => $perm?$perm:($folder_set['perm']?$folder_set['perm']:0), 'fsperm' =>$folder_set['fsperm']?$folder_set['fsperm']:0, 'fname' => $fname, 'flag' => $flag, 'disp' => $folder_set['disp']?$folder_set['disp']:0, 'iconview' => $folder_set['iconview']?$folder_set['iconview']:4, 'innav' => 0, 'isdelete' => 0 ); foreach ($params as $k => $v) { if (in_array($k, $folderparams)) { $top[$k] = $v; } } if ($topfid = DB::result_first("select fid from " . DB::table('folder') . " where uid='{$_G[uid]}' and fname = '{$top[fname]}' and flag='{$top[flag]}' ")) { C::t('folder')->update($topfid, $top); } else { $appid = $params['appid'] ? $params['appid'] : 0; $folderattr = array(); foreach ($params as $k => $v) { if (in_array($k, $folderparams)) { $top[$k] = $v; } else { $folderattr[$k] = $v; } } $topfid = C::t('folder')->insert($top, $appid); if ($folderattr) { C::t('folder_attr')->insert_data_by_fid($topfid, $folderattr); } } $data['folderarr'] = C::t('folder')->fetch_by_fid($topfid); return $data; } //创建目录 public function CreateFolder($pfid, $fname, $perm = 0, $params = array(), $ondup = 'newcopy',$force=false) { global $_G, $_GET; $folderparams = array('innav', 'fsperm', 'disp', 'iconview', 'display', 'flag', 'default','perm'); if ($pfid == 0) { return self::createTopFolderByFname($fname, $perm, $params, $ondup); } $fname = self::name_filter($fname); if (!$folder = C::t('folder')->fetch($pfid)){//DB::fetch_first("select fid,pfid,iconview,disp,gid,perm_inherit from %t where fid=%d", array('folder', $pfid))) { return array('error' => lang('parent_directory_not_exist')); } if (!$force && !perm_check::checkperm_Container($pfid, 'folder')) { return array('error' => lang('no_privilege')); } if (($ondup == 'overwrite') && ($rid = self::getRepeatIDByName($fname, $pfid, true))) {//如果目录下有同名目录 $data = array(); $data['icoarr'] = C::t('resources')->fetch_by_rid($rid); $data['folderarr'] = self::getFolderByIcosdata($data['icoarr']); return $data; } else $fname = self::getFolderName($fname, $pfid); //重命名 $path = C::t('resources_path')->fetch_pathby_pfid($folder['fid']); //如果flag!=='folder',使用此flag的默认设置 $flag=$params['flag']?$params['flag']:'folder'; if($flag!=='folder') $folder_set=C::t('folder_flag')->fetch($flag); $setarr = array('fname' => $fname, 'uid' => $_G['uid'], 'username' => $_G['username'], 'pfid' => $folder['fid'], 'disp' => $folder_set['disp']?$folder_set['disp']:$folder['disp'], 'iconview' => $folder_set['iconview']?$folder_set['iconview']:$folder['iconview'], 'perm' => $perm?$perm:($folder_set['perm']?$folder_set['perm']:0), 'fsperm' =>$folder_set['fsperm']?$folder_set['fsperm']:0, 'flag' =>$flag, 'dateline' => $_G['timestamp'], 'gid' => $folder['gid'], ); $folderattr = array(); foreach ($params as $k => $v) { if (in_array($k, $folderparams)) { $setarr[$k] = $v; } else { $folderattr[$k] = $v; } } //$appid = $params['appid'] ? $params['appid']:0; if ($setarr['fid'] = C::t('folder')->insert($setarr)) { $setarr['perm'] = perm_check::getPerm($setarr['fid']); $setarr['perm1'] = perm_check::getPerm1($setarr['fid']); if ($folderattr) { C::t('folder_attr')->insert_data_by_fid($setarr['fid'], $folderattr); } $setarr['title'] = $setarr['fname']; $setarr['ext'] = ''; $setarr['size'] = 0; $setarr1 = array( 'uid' => $_G['uid'], 'username' => $_G['username'], 'oid' => $setarr['fid'], 'name' => $setarr['fname'], 'type' => 'folder', 'flag' => $setarr['flag'], 'dateline' => $_G['timestamp'], 'pfid' => intval($folder['fid']), 'gid' => intval($folder['gid']), 'ext' => '', 'size' => 0, ); if ($setarr1['rid'] = C::t('resources')->insert_data($setarr1)) { $setarr1['relativepath'] = $path . $setarr1['name'] . '/'; $setarr1['path'] = $setarr1['rid']; $setarr1['dpath'] = dzzencode($setarr1['rid']); $setarr1['bz'] = ''; //addtoconfig($setarr1); /* $setarr1['fsize'] = formatsize($setarr1['size']); $setarr1['img'] = 'dzz/images/extimg/folder.png'; $setarr1['ftype'] = getFileTypeName($setarr1['type'], $setarr1['ext']); $setarr1['fdateline'] = dgmdate($setarr1['dateline']); $setarr1['sperm'] = perm_FileSPerm::typePower($setarr1['type'], $setarr1['ext']);*/ if ($fid = $setarr1['pfid']) { $event = 'creat_folder'; $path = preg_replace('/dzz:(.+?):/', '', $path) ? preg_replace('/dzz:(.+?):/', '', $path) : ''; $hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($setarr1['pfid'], $setarr1['gid']); $eventdata = array( 'foldername' => $setarr1['name'], 'fid' => $setarr1['oid'], 'username' => $setarr1['username'], 'uid' => $setarr1['uid'], 'path' => $setarr1['path'], 'position' => $path, 'hash' => $hash ); C::t('resources_event')->addevent_by_pfid($setarr1['pfid'], $event, 'create', $eventdata, $setarr1['gid'], $setarr1['rid'], $setarr1['name']); } return array('icoarr' => C::t('resources')->fetch_by_rid($setarr1['rid']), 'folderarr' => $setarr); } else { C::t('folder')->delete_by_fid($setarr['fid'],true); return array('error' => lang('data_error')); } } return false; } public function getPath($ext, $dir = 'dzz') { global $_G; if ($ext && in_array(trim($ext, '.'), $_G['setting']['unRunExts'])) { $ext = '.dzz'; } $subdir = $subdir1 = $subdir2 = ''; $subdir1 = date('Ym'); $subdir2 = date('d'); $subdir = $subdir1 . '/' . $subdir2 . '/'; $target1 = $dir . '/' . $subdir . 'index.html'; $target = $dir . '/' . $subdir; $target_attach = $_G['setting']['attachdir'] . $target1; $targetpath = dirname($target_attach); dmkdir($targetpath); return $target . date('His') . '' . strtolower(random(16)) . $ext; } public function save($target, $filename = '') { global $_G; $filepath = $_G['setting']['attachdir'] . $target; $md5 = md5_file($filepath); $filesize = fix_integer_overflow(filesize($filepath)); if ($md5 && $attach = DB::fetch_first("select * from %t where md5=%s and filesize=%d", array('attachment', $md5, $filesize))) { $attach['filename'] = $filename; $pathinfo = pathinfo($filename); $ext = $pathinfo['extension'] ? $pathinfo['extension'] : ''; $attach['filetype'] = strtolower($ext); @unlink($filepath); unset($attach['attachment']); return $attach; } else { $pathinfo = pathinfo($filename); $ext = $pathinfo['extension'] ? $pathinfo['extension'] : ''; $pathinfo1 = pathinfo($target); $ext_dzz = strtolower($pathinfo1['extension']); if ($ext_dzz == 'dzz') { $unrun = 1; } else { $unrun = 0; } $filesize = filesize($filepath); $remote = 0; $attach = array( 'filesize' => $filesize, 'attachment' => $target, 'filetype' => strtolower($ext), 'filename' => $filename, 'remote' => $remote, 'copys' => 0, 'md5' => $md5, 'unrun' => $unrun, 'dateline' => $_G['timestamp'], ); if ($attach['aid'] = C::t('attachment')->insert($attach, 1)) { $remoteid = io_remote::getRemoteid($attach); if ($_G['setting']['thumb_active'] && $remoteid < 2 && in_array($attach['filetype'], array('jpg', 'jpeg', 'png'))) {//主动模式生成缩略图 try { foreach ($_G['setting']['thumbsize'] as $key => $value) { self::createThumb('dzz::' . $attach['attachment'], $key); } /*self::createThumb('dzz::'.$attach['attachment'],256,256); self::createThumb('dzz::'.$attach['attachment'],1440,900);*/ } catch (Exception $e) { } } C::t('local_storage')->update_usesize_by_remoteid($attach['remote'], $attach['filesize']); if ($remoteid > 1) dfsockopen($_G['siteurl'] . 'misc.php?mod=movetospace&aid=' . $attach['aid'] . '&remoteid=0', 0, '', '', false, '', 1); unset($attach['attachment']); return $attach; } else { return false; } } } public function uploadToattachment($attach, $fid) { global $_G, $documentexts, $space, $docexts; if (!perm_check::checkperm_Container($fid, 'upload')) { return array('error' => lang('no_privilege')); } $gid = DB::result_first("select gid from %t where fid=%d", array('folder', $fid)); $attach['filename'] = self::getFileName($attach['filename'], $fid); $path = C::t('resources_path')->fetch_pathby_pfid($fid); $imgexts = array('jpg', 'jpeg', 'gif', 'png', 'bmp'); //图片文件时 if (in_array(strtolower($attach['filetype']), $imgexts)) { $icoarr = array( 'uid' => $_G['uid'], 'username' => $_G['username'], 'name' => $attach['filename'], 'dateline' => $_G['timestamp'], 'pfid' => intval($fid), 'type' => 'image', 'flag' => '', 'vid' => 0, 'gid' => intval($gid), 'ext' => $attach['filetype'], 'size' => $attach['filesize'] ); if ($icoarr['rid'] = C::t('resources')->insert_data($icoarr)) {//插入主表 $sourceattrdata = array( 'postip' => $_G['clientip'], 'title' => $attach['filename'], 'aid' => $attach['aid'] ); if (C::t('resources_attr')->insert_attr($icoarr['rid'], $icoarr['vid'], $sourceattrdata)) {//插入属性表 C::t('attachment')->update($attach['aid'], array('copys' => $attach['copys'] + 1));//增加图片使用数 $icoarr = array_merge($attach, $icoarr, $sourceattrdata); $icoarr['img'] = DZZSCRIPT . '?mod=io&op=thumbnail&size=small&path=' . dzzencode($icoarr['rid']); $icoarr['url'] = DZZSCRIPT . '?mod=io&op=thumbnail&size=large&path=' . dzzencode($icoarr['rid']); $icoarr['bz'] = ''; $icoarr['rbz'] = io_remote::getBzByRemoteid($attach['remote']); $icoarr['relativepath'] = $path . $icoarr['name']; $icoarr['path'] = $icoarr['rid']; $icoarr['dpath'] = dzzencode($icoarr['rid']); $icoarr['apath'] = dzzencode('attach::' . $attach['rid']); $event = 'creat_file'; $path = preg_replace('/dzz:(.+?):/', '', $path) ? preg_replace('/dzz:(.+?):/', '', $path) : ''; $hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($fid, $icoarr['gid']); $eventdata = array( 'title' => $icoarr['name'], 'aid' => $icoarr['aid'], 'username' => $icoarr['username'], 'uid' => $icoarr['uid'], 'path' => $icoarr['path'], 'position' => $path, 'hash' => $hash ); C::t('resources_event')->addevent_by_pfid($fid, $event, 'create', $eventdata, $icoarr['gid'], $icoarr['rid'], $icoarr['name']); } else { C::t('resources')->delete_by_rid($icoarr['rid']); return array('error' => lang('data_error')); } } } elseif (in_array(strtoupper($attach['filetype']), $documentexts)) {//文档文件时 $icoarr = array( 'uid' => $_G['uid'], 'username' => $_G['username'], 'name' => $attach['filename'], 'type' => ($attach['filetype'] == 'dzzdoc') ? 'dzzdoc' : 'document', 'dateline' => $_G['timestamp'], 'pfid' => intval($fid), 'flag' => '', 'vid' => 0, 'gid' => intval($gid), 'ext' => $attach['filetype'], 'size' => $attach['filesize'] ); if ($icoarr['rid'] = C::t('resources')->insert_data($icoarr)) { C::t('attachment')->update($attach['aid'], array('copys' => $attach['copys'] + 1));//增加文档使用数 $sourcedata = array( 'title' => $attach['filename'], 'desc' => '', 'aid' => $attach['aid'], 'img' => geticonfromext($icoarr['ext'], $icoarr['type']) ); if (C::t('resources_attr')->insert_attr($icoarr['rid'], $icoarr['vid'], $sourcedata)) { $icoarr = array_merge($sourcedata, $attach, $icoarr); $icoarr['img'] = geticonfromext($icoarr['ext'], $icoarr['type']); $icoarr['url'] = DZZSCRIPT . '?mod=io&op=getStream&path=' . dzzencode($icoarr['rid']); $icoarr['bz'] = ''; $icoarr['rbz'] = io_remote::getBzByRemoteid($attach['remote']);; $icoarr['relativepath'] = $path . $icoarr['name']; $icoarr['path'] = $icoarr['rid']; $icoarr['dpath'] = dzzencode($icoarr['rid']); $icoarr['apath'] = dzzencode('attach::' . $attach['aid']); $event = 'creat_file'; $path = preg_replace('/dzz:(.+?):/', '', $path) ? preg_replace('/dzz:(.+?):/', '', $path) : ''; $hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($fid, $icoarr['gid']); $eventdata = array( 'title' => $icoarr['name'], 'aid' => $icoarr['aid'], 'username' => $icoarr['username'], 'uid' => $icoarr['uid'], 'path' => $icoarr['path'], 'position' => $path, 'hash' => $hash ); C::t('resources_event')->addevent_by_pfid($fid, $event, 'create', $eventdata, $icoarr['gid'], $icoarr['rid'], $icoarr['name'], $icoarr['name']); } else { C::t('resources')->delete_by_rid($icoarr['rid']); return array('error' => lang('data_error')); } } } else {//附件 $icoarr = array( 'uid' => $_G['uid'], 'username' => $_G['username'], 'name' => $attach['filename'], 'type' => 'attach', 'flag' => '', 'vid' => 0, 'dateline' => $_G['timestamp'], 'pfid' => intval($fid), 'gid' => intval($gid), 'ext' => $attach['filetype'], 'size' => $attach['filesize'] ); if ($icoarr['rid'] = C::t('resources')->insert_data($icoarr)) { $sourcedata = array( 'title' => $attach['filename'], 'desc' => '', 'aid' => $attach['aid'], 'img' => geticonfromext($icoarr['ext'], $icoarr['type']) ); C::t('attachment')->update($attach['aid'], array('copys' => $attach['copys'] + 1)); if (C::t('resources_attr')->insert_attr($icoarr['rid'], $icoarr['vid'], $sourcedata)) { $icoarr = array_merge($sourcedata, $attach, $icoarr); $icoarr['img'] = geticonfromext($icoarr['ext'], $icoarr['type']); $icoarr['url'] = DZZSCRIPT . '?mod=io&op=getStream&path=' . dzzencode($icoarr['rid']); $icoarr['bz'] = ''; $icoarr['rbz'] = io_remote::getBzByRemoteid($attach['remote']);; $icoarr['relativepath'] = $path . $icoarr['name']; $icoarr['path'] = $icoarr['rid']; $icoarr['dpath'] = dzzencode($icoarr['rid']); $icoarr['apath'] = dzzencode('attach::' . $attach['aid']); $event = 'creat_file'; $path = preg_replace('/dzz:(.+?):/', '', $path) ? preg_replace('/dzz:(.+?):/', '', $path) : ''; $eventdata = array( 'title' => $icoarr['name'], 'aid' => $icoarr['aid'], 'username' => $icoarr['username'], 'uid' => $icoarr['uid'], 'path' => $icoarr['path'], 'position' => $path ); C::t('resources_event')->addevent_by_pfid($fid, $event, 'create', $eventdata, $icoarr['gid'], $icoarr['rid']); } else { C::t('resources')->delete_by_rid($icoarr['rid']); return array('error' => lang('data_error')); } } } if ($icoarr['rid']) { if ($icoarr['size']) SpaceSize($icoarr['size'], $gid, true); //addtoconfig($icoarr); $icoarr['fsize'] = formatsize($icoarr['size']); $icoarr['ftype'] = getFileTypeName($icoarr['type'], $icoarr['ext']); $icoarr['fdateline'] = dgmdate($icoarr['dateline']); $icoarr['sperm'] = perm_FileSPerm::typePower($icoarr['type'], $icoarr['ext']); return $icoarr; } else { return array('error' => lang('data_error')); } } public function createFolderByPath($path, $pfid, $params = array()) { $data = array('pfid' => $pfid); if (!$path) { $data['pfid'] = $pfid; } else { $patharr = explode('/', $path); //生成目录 foreach ($patharr as $fname) { if (!$fname) continue; //判断是否含有此目录 if ($fid = DB::result_first("select fid from %t where pfid=%d and isdelete<1 and fname=%s", array('folder', $pfid, $fname))) { $pfid = $data['pfid'] = $fid; } else { if ($re = self::CreateFolder($data['pfid'], $fname, 0, $params, 'overwrite')) { $data['icoarr'][] = $re['icoarr']; $data['folderarr'][] = $re['folderarr']; $pfid = $data['pfid'] = $re['folderarr']['fid']; } else { $data['error'] = 'create folder error!'; return $data; } } } } return $data; } private function getCache($path) { $cachekey = 'dzz_upload_' . md5($path); if ($cache = C::t('cache')->fetch($cachekey)) { return $cache['cachevalue']; } else { return false; } } private function saveCache($path, $str) { global $_G; $cachekey = 'dzz_upload_' . md5($path); C::t('cache')->insert(array( 'cachekey' => $cachekey, 'cachevalue' => $str, 'dateline' => $_G['timestamp'], ), false, true); } private function deleteCache($path) { $cachekey = 'dzz_upload_' . md5($path); C::t('cache')->delete($cachekey); } private function getPartInfo($content_range) { $arr = array(); if (!$content_range) { $arr['ispart'] = false; $arr['iscomplete'] = true; } elseif (is_array($content_range)) { $arr['ispart'] = true; $partsize = getglobal('setting/maxChunkSize'); $arr['partnum'] = ceil(($content_range[2] + 1) / $partsize); if (($content_range[2] + 1) >= $content_range[3]) { $arr['iscomplete'] = true; } else { $arr['iscomplete'] = false; } } else { return false; } return $arr; } public function uploadStream($file, $filename, $pfid, $relativePath = '', $content_range = array(), $params = array()) { $data = array(); //处理目录(没有分片或者最后一个分片时创建目录 $arr = self::getPartInfo($content_range); $data['pfid'] = intval($pfid); if ($relativePath && $arr['iscomplete']) { $data = self::createFolderByPath($relativePath, $pfid, $params); if (isset($data['error'])) { return array('error' => $data['error']); } } if(substr($filename,-7)=='.folder'){ $data = self::createFolderByPath($relativePath?$relativePath:substr($filename,0,-7), $pfid, $params); if (isset($data['error'])) { return array('error' => $data['error']); } if(empty($data['folderarr'])){ $data['folderarr']=array(); $data['folderarr'][]=C::t('folder')->fetch_by_fid($data['pfid']); } if(empty($data['icoarr'])){ $data['icoarr']=array(); if($rid=DB::result_first("select rid from %t where type='folder' and oid=%d",array('resources',$data['pfid']))){ $data['icoarr'][]=C::t('resources')->fetch_by_rid($rid); } } return $data; } $arr['flag'] = $pfid . '_' . $relativePath; //获取文件内容 $fileContent = ''; if (!$handle = fopen($file, 'rb')) { return array('error' => lang('open_file_error')); } while (!feof($handle)) { $fileContent .= fread($handle, 8192); } fclose($handle); if ($arr['ispart']) { $re = self::upload($fileContent, $data['pfid'], $filename, $arr); if ($arr['iscomplete']) { if (empty($re['error'])) { $data['icoarr'][] = $re; return $data; } else { $data['error'] = $re['error']; return $data; } } else { return true; } } else { $re = self::upload($fileContent, $data['pfid'], $filename); if (empty($re['error'])) { if($re['type'] == 'image' && $re['aid']){ $re['imgpath'] = DZZSCRIPT.'?mod=io&op=thumbnail&path='.dzzencode('attach::' . $re['aid']); } $re['monthdate'] = dgmdate($re['dateline'],'m-d'); $re['hourdate'] = dgmdate($re['dateline'],'H:i'); $re['pfid'] = $data['pfid']; $re['colect'] = 0; $data['icoarr'][] = $re; return $data; } else { $data['error'] = $re['error']; return $data; } } } public function upload_by_content($fileContent, $path, $filename,$partinfo=array()) { return self::upload($fileContent, $path, $filename,$partinfo); } /** * 上传文件 * 注意:此方法适用于上传不大于2G的单个文件。 * @param string $fileContent 文件内容字符串 * @param string $fid 上传文件的目标保存目录fid * @param string $fileName 文件名 * @param string $ondup overwrite:表示覆盖同名文件;newcopy:表示生成文件副本并进行重命名,命名规则为“文件名_日期.后缀”。 * @param boolean $isCreateSuperFile 是否分片上传 * @return string */ public function upload($fileContent, $fid, $filename, $partinfo = array(), $ondup = 'newcopy') { global $_G; $filename = self::name_filter($filename); if (($ondup == 'overwrite') && ($rid = self::getRepeatIDByName($filename, $fid))) {//如果目录下有同名文件 return self::overwriteUpload($fileContent, $rid, $filename, $partinfo);//覆盖 } else $nfilename = self::getFileName($filename, $fid); //重命名 if ($partinfo['ispart']) { if ($partinfo['partnum'] == 1) { if ($target = self::getCache($partinfo['flag'] . '_' . md5($filename))) { file_put_contents($_G['setting']['attachdir'] . $target, ''); } else { $pathinfo = pathinfo($filename); $ext = strtolower($pathinfo['extension']); $target = $this->getPath($ext ? ('.' . $ext) : '', 'dzz'); self::saveCache($partinfo['flag'] . '_' . md5($filename), $target); } } else { $target = self::getCache($partinfo['flag'] . '_' . md5($filename)); } if (!file_put_contents( $_G['setting']['attachdir'] . $target, $fileContent, FILE_APPEND ) ) { return array('error' => lang('cache_file_error')); } if (!$partinfo['iscomplete']) return true; else { self::deleteCache($partinfo['flag'] . '_' . md5($filename)); } } else { $pathinfo = pathinfo($filename); $ext = strtolower($pathinfo['extension']); $target = $this->getPath($ext ? ('.' . $ext) : '', 'dzz'); if (!empty($fileContent) && !file_put_contents($_G['setting']['attachdir'] . $target, $fileContent)) { return array('error' => lang('cache_file_error')); } } //判断空间大小 $gid = DB::result_first("select gid from %t where fid=%d", array('folder', $fid)); if (!SpaceSize(filesize($_G['setting']['attachdir'] . $target), $gid)) { @unlink($_G['setting']['attachdir'] . $target); return array('error' => lang('inadequate_capacity_space')); } if ($attach = $this->save($target, $nfilename)) { if ($attach['error']) { return array('error' => $attach['error']); } else { return $this->uploadToattachment($attach, $fid); } } else { return array('error' => 'Could not save uploaded file. The upload was cancelled, or server error encountered'); } } public function overwriteUpload($fileContent, $rid, $filename, $partinfo = array()) { global $_G, $space; if (!$fileContent) { return array('error' => lang('file_content_cannot_empty')); } if (!$icoarr = C::t('resources')->fetch_by_rid($rid)) { return array('error' => lang('file_not_exist1')); } $gid = DB::result_first("select gid from %t where fid=%d", array('folder', $icoarr['pfid'])); if (in_array($icoarr['type'], array('folder', 'link', 'video'))) { if (!perm_check::checkperm_Container($icoarr['pfid'], 'upload')) { return array('error' => lang('privilege')); } } elseif (!perm_check::checkperm_Container($icoarr['pfid'], 'upload')) { return array('error' => lang('privilege')); } $target = $icoarr['attachment']; if ($partinfo['ispart']) { if ($partinfo['partnum'] == 1) { file_put_contents($_G['setting']['attachdir'] . './' . $target, $fileContent); } else { file_put_contents( $_G['setting']['attachdir'] . './' . $target, $fileContent, FILE_APPEND ); if (!$partinfo['iscomplete']) return true; } } else { file_put_contents($_G['setting']['attachdir'] . './' . $target, $fileContent); } if (!$attach = self::save($target, $icoarr['name'])) { return array('error' => lang('file_save_exist')); } //计算用户新的空间大小 $csize = $attach['filesize'] - $icoarr['size']; //重新计算用户空间 if ($csize) { if (!SpaceSize($csize, $gid)) { return array('error' => lang('inadequate_capacity_space')); } SpaceSize($csize, $gid, 1); } $oldaid = $icoarr['aid']; //更新附件数量 if ($oldaid != $attach['aid']) { /* if ($icoarr['type'] == 'document') { C::t('source_document')->update($icoarr['did'], array('aid' => $attach['aid'])); } else { C::t('source_attach')->update($icoarr['qid'], array('aid' => $attach['aid'])); }*/ C::t('resources_attr')->update_by_skey($icoarr['rid'], $icoarr['vid'], array('aid' => $attach['aid'])); C::t('attachment')->update($attach['aid'], array('copys' => $attach['copys'] + 1)); C::t('attachment')->delete_by_aid($oldaid); } $icoarr['size'] = $attach['filesize']; $icoarr['aid'] = $attach['aid']; return $icoarr; } //判断附件是否已经存在,返回附件数组 public function dzz_imagetoattach($link, $gid) { global $_G; $md5 = md5_file($link); if ($md5 && $attach = C::t('attachment')->fetch_by_md5($md5)) { //判断空间大小 if (!SpaceSize($attach['filesize'], $gid)) { return array('error' => lang('inadequate_capacity_space')); } return $attach; } else { if ($target = imagetolocal($link, 'dzz')) { //判断空间大小 $size = @filesize($_G['setting']['attachdir'] . $target); //判断空间大小 if (!SpaceSize($size, $gid)) { @unlink($_G['setting']['attachdir'] . $target); return array('error' => lang('inadequate_capacity_space')); } $object = str_replace('/', '-', $target); $remote = 0; $attach = array( 'filesize' => intval($size), 'attachment' => $target, 'filetype' => strtolower(substr(strrchr($link, '.'), 1, 10)), 'filename' => substr(strrchr($link, '/'), 1, 50), 'remote' => $remote, 'copys' => 1, 'md5' => $md5, 'dateline' => $_G['timestamp'], ); if ($attach['aid'] = DB::insert('attachment', ($attach), 1)) { C::t('local_storage')->update_usesize_by_remoteid($attach['remote'], $attach['filesize']); dfsockopen($_G['siteurl'] . 'misc.php?mod=movetospace&aid=' . $attach['aid'] . '&remoteid=0', 0, '', '', FALSE, '', 1); return $attach; } } } return false; } public function linktoimage($link, $pfid) { global $_G, $space; $fid = $pfid; $gid = DB::result_first("select gid from %t where fid =%d", array('folder', $pfid)); if (!$cimage = DB::fetch_first("select * from " . DB::table('collect') . " where ourl='{$link}' and type = 'img'")) { if ($attach = self::dzz_imagetoattach($link, $gid)) { if ($attach['error']) return $attach; $data = array('type' => 'img', 'aid' => $attach['aid'], 'title' => '', 'desc' => ''); $cimage = array( 'ourl' => $link, 'data' => serialize($data), 'copys' => 0, 'type' => 'img', 'dateline' => $_G['timestamp'] ); $cimage['cid'] = DB::insert('collect', ($cimage), 1); } else { return array('error' => lang('image_to_local_error')); } } else { $data = unserialize($cimage['data']); C::t('attachment')->addcopy_by_aid($data['aid']); $attach = C::t('attachment')->fetch($data['aid']); } //判断空间大小 if (!SpaceSize($attach['filesize'], $gid)) { return array('error' => lang('inadequate_capacity_space')); } $path = C::t('resources_path')->fetch_pathby_pfid($fid); $path = $path . '/' . self::getFileName(strtolower(substr(strrchr($link, '/'), 1, 50)), $fid) . '.' . $attach['filetype']; $attachment = $_G['setting']['attachdir'] . './' . $attach['attachment']; $imginfo = @getimagesize($attachment); $icoarr = array( 'uid' => $_G['uid'], 'username' => $_G['username'], 'name' => self::getFileName(strtolower(substr(strrchr($link, '/'), 1, 50)), $fid), 'flag' => '', 'type' => 'image', 'vid' => 0, 'dateline' => $_G['timestamp'], 'pfid' => $fid, 'oid' => $cimage['cid'], 'gid' => $gid, 'ext' => $attach['filetype'], 'size' => $attach['filesize'], ); if ($icoarr['rid'] = C::t('resources')->insert_data($icoarr)) { $sourceattr = array( 'title' => $attach['filename'], 'postip' => $_G['clientip'], 'desc' => $data['desc'], 'aid' => $data['aid'], 'width' => $imginfo[0], 'height' => $imginfo[1], ); if (C::t('resources_attr')->insert_attr($icoarr['rid'], $icoarr['vid'], $sourceattr)) { C::t('collect')->update($cimage['cid'], array('copys' => $cimage['copys'] + 1)); $icoarr = array_merge($sourceattr, $icoarr); $icoarr['img'] = DZZSCRIPT . '?mod=io&op=thumbnail&&size=small&path=' . rawurlencode($icoarr['aid']); $icoarr['url'] = DZZSCRIPT . '?mod=io&op=thumbnail&&size=large&path=' . rawurlencode($icoarr['aid']); $icoarr['bz'] = ''; $icoarr['aid'] = $sourceattr['aid']; $data['rbz'] = io_remote::getBzByRemoteid($icoarr['remote']); $icoarr['relativepath'] = $path; $icoarr['path'] = $icoarr['rid']; $icoarr['dpath'] = dzzencode($icoarr['rid']); $icoarr['apath'] = dzzencode('attach::' . $icoarr['aid']); if ($icoarr['size']) SpaceSize($icoarr['size'], $gid, true); //addtoconfig($icoarr); $icoarr['fsize'] = formatsize($icoarr['size']); $icoarr['ftype'] = getFileTypeName($icoarr['type'], $icoarr['ext']); $icoarr['fdateline'] = $icoarr['dateline']; $event = 'creat_file'; $path = preg_replace('/dzz:(.+?):/', '', $path) ? preg_replace('/dzz:(.+?):/', '', $path) : ''; $hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($fid, $icoarr['gid']); $eventdata = array( 'name' => $icoarr['fname'], 'fid' => $icoarr['oid'], 'username' => $icoarr['username'], 'uid' => $icoarr['uid'], 'path' => $icoarr['path'], 'position' => $path, 'hash' => $hash ); C::t('resources_event')->addevent_by_pfid($icoarr['pfid'], $event, 'create', $eventdata, $icoarr['gid'], $icoarr['rid'], $icoarr['name']); } else { C::t('resources')->delete_by_rid($icoarr['rid']); return array('error' => lang('linktoimage_error')); } } if ($icoarr['rid']) { return $icoarr; } else { return array('error' => lang('linktoimage_error')); } } public function linktomusic($link, $pfid) { global $_G; @set_time_limit(60); $fid = $pfid; $gid = DB::result_first("select gid from %t where fid =%d", array('folder', $pfid)); if (!$cmusic = DB::fetch_first("select * from " . DB::table('collect') . " where ourl='{$link}' and type = 'music'")) { $data = array('type' => 'music', 'url' => $link, 'img' => '', 'desc' => '', 'title' => strtolower(substr(strrchr($link, '/'), 1, 50))); $cmusic = array( 'ourl' => $link, 'data' => serialize($data), 'copys' => 0, 'type' => 'music', 'dateline' => $_G['timestamp'] ); $cmusic['cid'] = DB::insert('collect', ($cmusic), 1); } else { $data = unserialize($cmusic['data']); C::t('collect')->addcopy_by_cid($cmusic['id']); } $path = C::t('resources_path')->fetch_pathby_pfid($fid); $path = $path . '/' . self::getFileName($data['title'], $fid); $icoarr = array( 'uid' => $_G['uid'], 'username' => $_G['username'], 'name' => self::getFileName($data['title'], $fid), 'flag' => '', 'type' => 'music', 'pfid' => $fid, 'oid' => $cmusic['cid'], 'vid' => 0, 'dateline' => $_G['timestamp'], 'gid' => $gid, 'ext' => '', 'size' => 0 ); if ($icoarr['rid'] = C::t('resources')->insert_data($icoarr)) { $sourcedata = array( 'img' => $data['img'], 'desc' => $data['desc'], 'title' => $data['title'], ); $sourcedata['icon'] = $sourcedata['icon'] ? $sourcedata['icon'] : geticonfromext('', 'music'); if (C::t('resources_attr')->insert_attr($icoarr['rid'], $icoarr['vid'], $sourcedata)) { C::t('collect')->update($cmusic['cid'], array('copys' => $cmusic['copys'] + 1)); $icoarr['url'] = $sourcedata['url']; $icoarr['img'] = $sourcedata['icon']; $icoarr['bz'] = ''; $icoarr['relativepath'] = $path; $icoarr['path'] = $icoarr['rid']; $icoarr['dpath'] = dzzencode($icoarr['rid']); //addtoconfig($icoarr); $icoarr['fsize'] = formatsize($icoarr['size']); $icoarr['ftype'] = getFileTypeName($icoarr['type'], $icoarr['ext']); $icoarr['fdateline'] = $icoarr['dateline']; $event = 'creat_file'; $path = preg_replace('/dzz:(.+?):/', '', $path) ? preg_replace('/dzz:(.+?):/', '', $path) : ''; $hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($icoarr['pfid'], $icoarr['gid']); $eventdata = array( 'name' => $icoarr['fname'], 'fid' => $icoarr['oid'], 'username' => $icoarr['username'], 'uid' => $icoarr['uid'], 'path' => $icoarr['path'], 'position' => $path, 'hash' => $hash ); C::t('resources_event')->addevent_by_pfid($icoarr['pfid'], $event, 'create', $eventdata, $icoarr['gid'], $icoarr['rid'], $icoarr['name']); } else { C::t('resources')->delete_by_rid($icoarr['rid']); return array('error' => lang('linktomusic_error')); } } if ($icoarr['rid']) { return $icoarr; } else { return array('error' => lang('linktomusic_error')); } } public function linktovideo($link, $pfid) { global $_G; @set_time_limit(60); $fid = $pfid; $gid = DB::result_first("select gid from %t where fid =%d", array('folder', $pfid)); if (!$cvideo = DB::fetch_first("select * from " . DB::table('collect') . " where ourl='{$link}' and type = 'video'")) { $arr = array(); require_once libfile('function/code'); if (!$arr = parseflv($link)) { return false; } //采集标题和描述 if (!$arr['title'] || !$arr['description']) { require_once dzz_libfile('class/caiji'); $caiji = new caiji($link); $arr['title'] = $caiji->getTitle(); $arr['description'] = $caiji->getDescription(); } $data = array( 'type' => 'video', 'url' => $arr['url'], 'img' => $arr['img'], 'desc' => $arr['description'], 'title' => $arr['title'], ); $cvideo = array( 'ourl' => $link, 'data' => serialize($data), 'copys' => 0, 'type' => 'video', 'dateline' => $_G['timestamp'] ); $cvideo['cid'] = DB::insert('collect', ($cvideo), 1); } else { $data = unserialize($cvideo['data']); C::t('collect')->addcopy_by_cid($cvideo['id']); } //如果原先的标题和描述没采集到,重新采集 if (!$data['title'] || !$data['desc']) { require_once dzz_libfile('class/caiji'); $caiji = new caiji($link); $data['title'] = $caiji->getTitle(); $data['desc'] = $caiji->getDescription(); $usedata = $data; $data = serialize($data); C::t('collect')->update($cvideo['cid'], array('data' => $data)); } $data = ($usedata) ? $usedata : $data; $path = C::t('resources_path')->fetch_pathby_pfid($fid); $path = $path . '/' . self::getFileName($data['title'], $fid) . '.swf'; $icoarr = array( 'uid' => $_G['uid'], 'username' => $_G['username'], 'name' => self::getFileName($data['title'], $fid), 'type' => 'video', 'oid' => $cvideo['cid'], 'dateline' => $_G['timestamp'], 'pfid' => $fid, 'vid' => 0, 'gid' => $gid, 'ext' => 'swf', 'flag' => '', 'size' => 0 ); if ($icoarr['rid'] = C::t('resources')->insert_data($icoarr)) { $sourcedata = array( 'url' => $data['url'], 'img' => $data['img'], 'desc' => $data['desc'], 'title' => $data['title'], ); if (C::t('resources_attr')->insert_attr($icoarr['rid'], $icoarr['vid'], $sourcedata)) { C::t('collect')->update($cvideo['cid'], array('copys' => $cvideo['copys'] + 1)); $icoarr['url'] = $sourcedata['url']; $icoarr['img'] = $sourcedata['icon']; $icoarr['bz'] = ''; $icoarr['relativepath'] = $path; $icoarr['path'] = $icoarr['rid']; $icoarr['dpath'] = dzzencode($icoarr['rid']); //addtoconfig($icoarr); $icoarr['fsize'] = formatsize($icoarr['size']); $icoarr['ftype'] = getFileTypeName($icoarr['type'], $icoarr['ext']); $icoarr['fdateline'] = $icoarr['dateline']; $event = 'creat_file'; $path = preg_replace('/dzz:(.+?):/', '', $path) ? preg_replace('/dzz:(.+?):/', '', $path) : ''; $hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($icoarr['pfid'], $icoarr['gid']); $eventdata = array( 'name' => $icoarr['fname'], 'fid' => $icoarr['oid'], 'username' => $icoarr['username'], 'uid' => $icoarr['uid'], 'path' => $icoarr['path'], 'position' => $path, 'hash' => $hash ); C::t('resources_event')->addevent_by_pfid($icoarr['pfid'], $event, 'create', $eventdata, $icoarr['gid'], $icoarr['rid'], $icoarr['name']); } else { C::t('resources')->delete_by_rid($icoarr['rid']); return array('error' => lang('linktovideo_error')); } } if ($icoarr['rid']) { return $icoarr; } else { return array('error' => lang('linktovideo_error')); } } public function linktourl($link, $pfid) { global $_G; $fid = $pfid; $gid = DB::result_first("select gid from %t where fid =%d", array('folder', $pfid)); $clink = array(); if (!$clink = DB::fetch_first("select * from " . DB::table("collect") . " where ourl='{$link}' and type = 'link'")) { $arr = array(); require_once dzz_libfile('class/caiji'); $caiji = new caiji($link); $arr['title'] = $caiji->getTitle(); $arr['desc'] = $caiji->getDescription(); $arr['url'] = $link; $arr['type'] = 'url'; $arr['img'] = ''; $data = array( 'type' => 'url', 'url' => $arr['url'], 'img' => $arr['img'], 'desc' => $arr['desc'], 'title' => $arr['title'], ); $clink = array( 'ourl' => $link, 'data' => serialize($data), 'copys' => 0, 'type' => 'link', 'dateline' => $_G['timestamp'] ); $clink['cid'] = DB::insert('collect', ($clink), 1); } else { $data = unserialize($clink['data']); C::t('collect')->addcopy_by_cid($clink['id']); } $parseurl = parse_url($link); $clink['title'] = self::getFileName($data['title'] ? $data['title'] : $parseurl['host'], $fid); $icondata = getUrlIcon($link); $path = C::t('resources_path')->fetch_pathby_pfid($fid); $path = $path . '/' . $data['title'] . '.' . $data['ext']; $icoarr = array( 'uid' => $_G['uid'], 'username' => $_G['username'], 'name' => $clink['title'], 'flag' => '', 'oid' => $clink['cid'], 'type' => 'link', 'dateline' => $_G['timestamp'], 'pfid' => $fid, 'gid' => $gid, 'vid' => 0, 'ext' => $icondata['ext'], 'size' => 0 ); if ($icoarr['rid'] = C::t('resources')->insert_data($icoarr)) { $sourcedata = array( 'url' => $link, 'desc' => $data['desc'], 'title' => $data['title'], 'imgid' => $icondata['did'], 'img' => $icondata['img'], ); if (C::t('resources_attr')->insert_attr($icoarr['rid'], $icoarr['vid'], $sourcedata)) { C::t('collect')->update($clink['cid'], array('copys' => $clink['copys'] + 1)); $icoarr['url'] = $sourcedata['url']; $icoarr['img'] = $sourcedata['img']; $icoarr['bz'] = ''; $icoarr['relativepath'] = $path; $icoarr['path'] = $icoarr['rid']; $icoarr['dpath'] = dzzencode($icoarr['rid']); //addtoconfig($icoarr); $icoarr['fsize'] = formatsize($icoarr['size']); $icoarr['ftype'] = getFileTypeName($icoarr['type'], $icoarr['ext']); $icoarr['fdateline'] = dgmdate($icoarr['dateline']); $event = 'creat_file'; $path = preg_replace('/dzz:(.+?):/', '', $path) ? preg_replace('/dzz:(.+?):/', '', $path) : ''; $hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($icoarr['pfid'], $icoarr['gid']); $eventdata = array( 'title' => $icoarr['fname'], 'fid' => $icoarr['oid'], 'username' => $icoarr['username'], 'uid' => $icoarr['uid'], 'path' => $icoarr['path'], 'position' => $path, 'hash' => $hash ); C::t('resources_event')->addevent_by_pfid($icoarr['pfid'], $event, 'create', $eventdata, $icoarr['gid'], $icoarr['rid'], $icoarr['name']); } else { C::t('resources')->delete_by_rid($icoarr['rid']); return array('error' => lang('linktourl_error')); } } if ($icoarr['rid']) { return $icoarr; } else { return array('error' => lang('linktourl_error')); } } /** * 移动文件到目标位置 * @param string $opath 被移动的文件路径 * @param string $path 目标位置(可能是同一api内或跨api,这两种情况分开处理) * @return icosdatas */ public function CopyTo($rid, $pfid, $iscopy = 0,$force=0) { try { $data = C::t('resources')->fetch_by_rid($rid); if (is_numeric($pfid)) {//如果目标位置也是本地 if($data['type']=='folder'){//判断上级目录不能移动到下级目录中 $pfids=C::t('folder')->fetch_path_by_fid($pfid); if(in_array($data['oid'],$pfids)){ $data['success']= lang('forbid_folder_to_sub_folder'); return $data; } } if (!$iscopy) { $re = self::FileMove($rid, $pfid, true,$force); $data['newdata'] = $re['icoarr']; $data['success'] = true; $data['moved'] = true; } else { $re = self::FileCopy($rid, $pfid, true,$force); $data['newdata'] = $re['icoarr']; $data['success'] = true; } if ($re['error']) $data['success'] = $re['error']; } else {//后期待处理 switch ($data['type']) { case 'folder'://创建目录 if ($re = IO::CreateFolder($pfid, $data['name'], 0)) { if (isset($re['error']) && intval($re['error_code']) != 31061) { $data['success'] = $re['error']; } else { $data['newdata'] = $re['icoarr']; $data['success'] = true; $contents = C::t('resources')->fetch_by_pfid($data['oid']); foreach ($contents as $key => $value) { $data['contents'][$key] = self::CopyTo($value['rid'], $re['folderarr']['path'], $iscopy); } } } break; case 'shortcut': case 'discuss': case 'dzzdoc': case 'user': case 'link': case 'music': case 'video': case 'topic': case 'app'://这些内容不能移动到api网盘内; $data['success'] = lang('document_only_stored_enterprise'); break; default: $re = IO::multiUpload($rid, $pfid, $data['name']); if ($re['error']) $data['success'] = $re['error']; else { $data['newdata'] = $re; $data['success'] = true; } break; } } } catch (Exception $e) { $data['success'] = $e->getMessage(); } $data['iscopy'] = $iscopy; return $data; } public function RecovercreateFolderByPath($path, $pfid, $params = array()) { $data = array('pfid' => $pfid); if (!$path) { $data['pfid'] = $pfid; } else { $patharr = explode('/', $path); //生成目录 foreach ($patharr as $fname) { if (!$fname) continue; $fpath = C::t('resources_path')->fetch_pathby_pfid($pfid, false); $path = $fpath . $fname . '/'; $fid = DB::result_first("select fid from %t where path = %s", array('resources_path', $path)); /* echo $fid; die;*/ //判断是否含有此目录 if ($finfo = DB::fetch_first("select f.fid,f.isdelete,r.rid from %t f left join %t r on f.fid=r.oid where f.fid=%d and f.fname=%s", array('folder', 'resources', $fid, $fname)) ) { if ($finfo['isdelete'] > 0) { if ($finfo['rid']) { if ($ricoid = self::getRepeatIDByName($fname, $pfid, true)) { $newname = self::getFolderName($fname, $pfid); self::rename($finfo['rid'], $newname); } //DB::update('resources', array('isdelete' => 0, 'deldateline' => 0, 'pfid' => $pfid), array('rid' => $finfo['rid'])); C::t('resources')->update_by_rid($finfo['rid'],array('isdelete' => 0, 'deldateline' => 0, 'pfid' => $pfid)); } //DB::update('folder', array('isdelete' => 0, 'deldateline' => 0, 'pfid' => $pfid), array('fid' => $finfo['fid'])); C::t('folder')->update($finfo['fid'],array('isdelete' => 0, 'deldateline' => 0, 'pfid' => $pfid)); } $pfid = $data['pfid'] = $finfo['fid']; } else { if ($re = self::CreateFolder($data['pfid'], $fname, 0, $params, 'overwrite')) { $data['icoarr'][] = $re['icoarr']; $data['folderarr'][] = $re['folderarr']; $pfid = $data['pfid'] = $re['folderarr']['fid']; } else { $data['error'] = 'create folder error!'; return $data; } } } } return $data; } //恢复文件 public function Recover($rid, $combine = true,$force=false) { global $_G; //判断文件是否存在 if (!$icoarr = C::t('resources')->fetch_info_by_rid($rid)) { return array('rid' => $rid, 'error' => lang('file_longer_exists')); } $newpfid = false; //获取回收站数据 if ($recycleinfo = C::t('resources_recyle')->get_data_by_rid($rid)) { //获取文件目录信息 if (!$dirinfo = C::t('resources_path')->parse_path_get_rootdirinfo($recycleinfo['pathinfo'])) { return array('rid' => $rid, 'error' => lang('file_longer_exists')); } if ($dirinfo['path']) { //若目录被删除恢复或创建目录 if (!$folderinfo = self::createFolderByPath($dirinfo['path'], $dirinfo['pfid'])) { return array('rid' => $rid, 'error' => lang('file_longer_exists')); } } if (isset($folderinfo['pfid'])) { $icoarr['pfid'] = $folderinfo['pfid']; if ($dirinfo['pfid'] != $folderinfo['pfid']) { $newpfid = $folderinfo['pfid']; } } else { $icoarr['pfid'] = $dirinfo['pfid']; } } $gid = $icoarr['gid']; //判断是否具有恢复权限 if (!$force && !perm_check::checkperm('delete', $icoarr)) { return array('rid' => $icoarr['rid'], 'error' => lang('no_privilege')); } else { $targetpath = C::t('resources_path')->fetch_pathby_pfid($icoarr['pfid']);//文件路径 $patharr = getpath($targetpath); $path = implode('\\', $patharr); //如果是文件夹 if ($icoarr['type'] == 'folder') { //验证空间大小 $contains = C::t('resources')->get_contains_by_fid($icoarr['oid'], true); if (!SpaceSize($contains['size'], $gid)) { return array('error' => lang('inadequate_capacity_space')); } if ($combine && $ricoid = self::getRepeatIDByName($icoarr['name'], $icoarr['pfid'], true)) { $rinfo = C::t('resources')->fetch_info_by_rid($ricoid); //目录下所有删除文件rid $rids = array(); $fids = array(); foreach (DB::fetch_all("select rid,type,oid from %t where pfid = %d and isdelete > 0", array('resources', $icoarr['oid'])) as $v) { if ($v['type'] == 'folder') { $fids[] = $v['oid']; } else { $rids[] = $v['rid']; } } // DB::update('resources', array('pfid' => $rinfo['oid']), 'rid in(' . dimplode($rids) . ')'); if (count($rids) > 0) C::t('resources')->update_by_rid($rids,array('pfid' => $rinfo['oid'])); //DB::update('folder', array('pfid' => $rinfo['oid']), 'fid in(' . dimplode($fids) . ')'); if (count($fids) > 0) C::t('folder')->update($fids, array('pfid' => $rinfo['oid'])); //更改当前目录下所有下级文件路径 C::t('resources_path')->update_pathdata_by_fid($icoarr['oid'], $rinfo['oid'], true); //更改动态归属 C::t('resources_event')->update_position_by_rid($rids, $rinfo['oid'], $rinfo['gid']); C::t('resources_event')->update_event_by_pfid($icoarr['oid'], $rinfo['oid']); //改变分享表数据 DB::update('shares', array('pfid' => $rinfo['oid']), array('pfid' => $icoarr['oid'])); foreach ($rids as $v) { self::Recover($v, $combine,$force); } self::delete($icoarr['rid']); //删除回收站数据 C::t('resources_recyle')->delete_by_rid($icoarr['rid']); } else { //判断目录中是否存在同名文件夹,如果有则将当前目录改名 if ($ricoid = self::getRepeatIDByName($icoarr['name'], $icoarr['pfid'], true)) { $newname = self::getFolderName($icoarr['name'], $icoarr['pfid']); self::rename($icoarr['rid'], $newname); } //如果当前文件夹是删除状态则恢复当前文件夹 if ($icoarr['isdelete'] > 0) { $recoverarr = array('isdelete' => 0, 'deldateline' => 0, 'pfid' => $icoarr['pfid']); //恢复文件夹表数据和resources表数据 //if (DB::update('folder', $recoverarr, 'fid =' . $icoarr['oid']) && DB::update('resources', $recoverarr, "rid ='{$rid}'")) { if( C::t('resources')->update_by_rid($rid,$recoverarr)){ C::t('folder')->update($icoarr['oid'],$recoverarr); $hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($icoarr['pfid'], $icoarr['gid']); //添加事件 $eventdata1 = array('username' => $_G['username'], 'position' => $path, 'filename' => $icoarr['name'], 'hash' => $hash); C::t('resources_event')->addevent_by_pfid($icoarr['pfid'], 'recover_file', 'recoverfile', $eventdata1, $icoarr['gid'], $rid, $icoarr['name']); } } /* //获取当前文件夹fid及所有下级目录fid $fids = C::t('resources_path')->fetch_folder_containfid_by_pfid($icoarr['oid']);*/ //目录下所有删除文件rid $rids = array(); foreach (DB::fetch_all("select rid from %t where pfid = %d and isdelete > 0", array('resources', $icoarr['oid'])) as $v) { $rids[] = $v['rid']; } foreach ($rids as $v) { self::Recover($v, $combine,$force); } if ($newpfid) { C::t('resources_path')->update_pathdata_by_fid($icoarr['oid'], $newpfid); } //删除回收站数据 C::t('resources_recyle')->delete_by_rid($icoarr['rid']); } } else { if (!DB::result_first("select isdelete from %t where rid = %s", array('resources', $rid))) { return; } $recoverarr = array('isdelete' => 0, 'deldateline' => 0, 'pfid' => $icoarr['pfid']); //如果目录下有同名文件,则恢复时生成新的文件名 if ($ricoid = self::getRepeatIDByName($icoarr['name'], $icoarr['pfid'], false)) { $recoverarr['name'] = self::getFileName($icoarr['name'], $icoarr['pfid']); } $totalsize = 0; if ($icoarr['vid'] > 0) { $totalsize = DB::result_first("select sum(size) from %t where rid = %s", array('resources_version', $icoarr['rid'])); } else { $totalsize = $icoarr['size']; } //重新设定空间值 if ($totalsize > 0) { SpaceSize($totalsize, $gid, 1); } //恢复文件 //if (DB::update('resources', $recoverarr, array('rid' => $rid))) { if(C::t('resources')->update_by_rid($rid,$recoverarr)){ //删除回收站收据 C::t('resources_recyle')->delete_by_rid($icoarr['rid']); //添加事件 $path = preg_replace('/dzz:(.+?):/', '', $path) ? preg_replace('/dzz:(.+?):/', '', $path) : ''; $hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($icoarr['pfid'], $icoarr['gid']); $eventdata = array( 'username' => getglobal('username'), 'filename' => $icoarr['name'], 'position' => $path, 'hash' => $hash ); C::t('resources_event')->addevent_by_pfid($icoarr['pfid'], 'recover_file', 'recoverfile', $eventdata, $icoarr['gid'], $rid, $icoarr['name']); $statisdata = array( 'uid' => getglobal('uid'), 'edits' => 1, 'editdateline' => TIMESTAMP ); C::t('resources_statis')->add_statis_by_rid($rid, $statisdata); } } } return array('rid' => $icoarr['rid'], 'name' => $icoarr['name']); } //本地文件移动到本地其它区域 public function FileMove($rid, $pfid, $first = true,$force) { global $_G, $_GET; @set_time_limit(0); @ini_set("memory_limit", "512M"); //判断目标目录是否存在 if (!$tfolder = DB::fetch_first("select * from " . DB::table('folder') . " where fid='{$pfid}'")) { return array('error' => lang('target_location_not_exist')); } //获取目标路径 $targetpdata = C::t('resources_path')->fetch_pathby_pfid($pfid, true);//目标路径 $targetpath = $targetpdata['path']; $targetarr = getpath($targetpath); $targetstr = implode('\\', $targetarr);//路径字符串 //判断文件数据是否存在 if ($icoarr = C::t('resources')->fetch($rid)) { //判断移动文件是否和目标文件在同一目录 if ($icoarr['pfid'] != $tfolder['fid']) { //判断有无删除权限 if(!$force){ if($icoarr['type'] == 'folder'){ $return = C::t('resources')->check_folder_perm($icoarr,'delete'); if($return['error']){ return array('error' => $return['error']); } }else{ if (!perm_check::checkperm('delete', $icoarr)) { return array('error' => lang('privilege')); } } //判断有无新建权限,如果是文件夹判断是否有文件件新建权限 if ($icoarr['type'] == 'folder' && !perm_check::checkperm_Container($pfid, 'folder')) { return array('error' => lang('privilege')); } elseif (!perm_check::checkperm_Container($pfid, 'upload')) { return array('error' => lang('privilege')); } } }else{ $return['icoarr'] = $icoarr; $return['icoarr']['monthdate'] = dgmdate($return['icoarr']['dateline'], 'm-d'); $return['icoarr']['hourdate'] = dgmdate($return['icoarr']['dateline'], 'H:i'); unset($icoarr); return $return; } //源文件路径 $oldpath = C::t('resources_path')->fetch_pathby_pfid($icoarr['pfid'], true); $oldarr = getpath($oldpath['path']); $oldpathstr = implode('\\', $oldarr); $oldpathstr = preg_replace('/dzz:(.+?):/', '', $oldpathstr); //判断空间大小 $ogid = $icoarr['gid']; $gid = $tfolder['gid']; $oldpfid = $icoarr['pfid']; $oldgid = $icoarr['gid']; //如果是文件夹类型 if ($icoarr['type'] == 'folder') { $contains = C::t('resources')->get_contains_by_fid($icoarr['oid'], true); if ($ogid != $gid && $contains['size'] && !SpaceSize($contains['size'], $gid)) { return array('error' => lang('inadequate_capacity_space')); } //如果是文件夹,并且目标目录中有同名文件夹,则执行合并 if ($currentfid = DB::result_first("select oid from %t where pfid = %d and `name` = %s and `type` = %s and isdelete < 1", array('resources', $tfolder['fid'], $icoarr['name'], 'folder')) ) { //移动源文件夹数据到目标目录同名文件夹 foreach (C::t('resources')->fetch_basicinfo_by_pfid($icoarr['oid']) as $value) { try { self::FileMove($value['rid'], $currentfid, false, false); unset($value); unset($folder); } catch (Exception $e) { } } //修改分享表状态 C::t('shares')->change_by_rid($icoarr['rid'], '-5'); //删除原文件夹数据 DB::delete('resources', array('rid' => $icoarr['rid'])); //删除路径表数据 DB::delete('resources_path', array('fid' => $icoarr['oid'])); //删除文件夹表数据 DB::delete('folder', array('fid' => $icoarr['oid'])); //删除事件表数据 C::t('resources_event')->delete_by_rid($icoarr['rid']); //添加事件 $oldhash = C::t('resources_event')->get_showtpl_hash_by_gpfid($oldpfid, $oldgid); $eventdata1 = array('username' => $_G['username'], 'olderposition' => $oldpathstr, 'newposition' => $targetstr, 'foldername' => $icoarr['name'], 'hash' => $oldhash); C::t('resources_event')->addevent_by_pfid($pfid, 'moved_folder', 'movedfolder', $eventdata1, $gid, $rid, $icoarr['name']); $hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($icoarr['pfid'], $ogid); $eventdata2 = array('username' => $_G['username'], 'newposition' => $targetstr, 'foldername' => $icoarr['name'], 'hash' => $hash); C::t('resources_event')->addevent_by_pfid($oldpfid, 'move_folder', 'movefolder', $eventdata2, $ogid, $rid, $icoarr['name']); } else { //查询源文件夹数据 if ($folder = C::t('folder')->fetch($icoarr['oid'])) { if ($icoarr['type'] == 'folder') $icoarr['name'] = self::getFolderName($icoarr['name'], $tfolder['fid']); $folder['uid'] = $_G['uid']; $folder['username'] = $_G['username']; $folder['gid'] = $gid; $folder['pfid'] = $pfid; $folder['fname'] = $icoarr['name']; $updatefids = array(); $fids = C::t('resources_path')->fetch_folder_containfid_by_pfid($folder['fid']); $folderinfo = array( 'uid' => $_G['uid'], 'username' => $_G['username'], 'gid' => $gid ); $rids = array(); foreach (DB::fetch_all("select rid from %t where pfid in(%n) or oid in(%n)", array('resources', $fids, $fids)) as $v) { $rids[] = $v['rid']; } //修改文件夹表数据和resources表数据 // DB::update('resources', array('oid' => $folder['fid'], 'pfid' => $pfid, 'gid' => $gid, 'uid' => $_G['uid'], 'username' => $_G['username']), array('rid' => $rid) if (C::t('folder')->update($folder['fid'], $folder) && C::t('resources')->update_by_rid($rid,array('oid' => $folder['fid'], 'pfid' => $pfid, 'gid' => $gid, 'uid' => $_G['uid'], 'username' => $_G['username'])) ) { //更改文件夹路径 C::t('resources_path')->update_pathdata_by_fid($folder['fid'], $pfid); if ($fids) { //修改资源表数据 //DB::update('resources', $folderinfo, "pfid IN(" . dimplode($fids) . ")"); C::t('resources')->update_by_pfids($fids,$folderinfo); //更改动态表数据 DB::update('resources_event', $folderinfo, "pfid IN(" . dimplode($fids) . ")"); //更改folder表数据 // DB::update('folder', $folderinfo, "pfid IN(" . dimplode($fids) . ")"); C::t('folder')->update_by_pfids($fids,$folderinfo); } if ($contains['size'] > 0) { SpaceSize(-$contains['size'], $ogid, 1); SpaceSize($contains['size'], $gid, 1); } //修改分享表状态 C::t('shares')->change_by_rid($rids, '-5'); //更改文件夹动态归属位置 DB::update('resources_event', array( 'uid' => $_G['uid'], 'username' => $_G['username'], 'gid' => $gid, 'pfid' => $pfid ), array('pfid' => $folder['fid'])); //添加事件 $oldhash = C::t('resources_event')->get_showtpl_hash_by_gpfid($oldpfid, $oldgid); $eventdata1 = array('username' => $_G['username'], 'olderposition' => $oldpathstr, 'newposition' => $targetstr, 'foldername' => $icoarr['name'], 'hash' => $oldhash); C::t('resources_event')->addevent_by_pfid($pfid, 'moved_folder', 'movedfolder', $eventdata1, $gid, $rid, $icoarr['name']); $hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($icoarr['pfid'], $ogid); $eventdata2 = array('username' => $_G['username'], 'newposition' => $targetstr, 'foldername' => $icoarr['name'], 'hash' => $hash); C::t('resources_event')->addevent_by_pfid($oldpfid, 'move_folder', 'movefolder', $eventdata2, $ogid, $rid, $icoarr['name']); } } else { return array('error', lang('folder_not_exist')); } } } else { $totalsize = 0; if ($icoarr['vid'] > 0) { $totalsize = DB::result_first("select sum(size) from %t where rid = %s", array('resources_version', $icoarr['rid'])); } else { $totalsize = $icoarr['size']; } if ($ogid != $gid && $totalsize && !SpaceSize($totalsize, $gid)) { return array('error' => lang('inadequate_capacity_space')); } //如果不是文件夹判断文件名重复 if ($icoarr['pfid'] != $tfolder['fid'] || $icoarr['isdelete'] > 0) { $icoarr['name'] = self::getFileName($icoarr['name'], $tfolder['fid']); } $icoarr['gid'] = $gid; $icoarr['uid'] = $_G['uid']; $icoarr['username'] = $_G['username']; $icoarr['pfid'] = $pfid; $icoarr['isdelete'] = 0; if (C::t('resources')->update_by_rid($icoarr['rid'], $icoarr)) { Hook::listen('movefile_after',$icoarr['rid']); //更改文件动态归属位置 C::t('resources_event')->update_position_by_rid($icoarr['rid'], $icoarr['pfid'], $icoarr['gid']); //修改分享表状态 C::t('shares')->change_by_rid($icoarr['rid'], '-5'); //添加移动文件动态 $oldhash = C::t('resources_event')->get_showtpl_hash_by_gpfid($oldpfid, $oldgid); $eventdata1 = array('username' => $_G['username'], 'olderposition' => $oldpathstr, 'newposition' => $targetstr, 'filename' => $icoarr['name'], 'hash' => $oldhash); C::t('resources_event')->addevent_by_pfid($pfid, 'moved_file', 'movedfile', $eventdata1, $gid, $rid, $icoarr['name']); $hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($icoarr['pfid'], $ogid); $eventdata2 = array('username' => $_G['username'], 'newposition' => $targetstr, 'filename' => $icoarr['name'], 'hash' => $hash); C::t('resources_event')->addevent_by_pfid($oldpfid, 'move_file', 'movefile', $eventdata2, $ogid, $rid, $icoarr['name']); } if ($ogid != $gid) { if ($totalsize > 0) { SpaceSize(-$totalsize, $ogid, 1); SpaceSize($totalsize, $gid, 1); } } if (!$first) { //addtoconfig($icoarr); } } } else { C::t('resources')->update_by_rid($icoarr['rid'], array('isdelete' => 0, 'deldateline' => 0)); //addtoconfig($icoarr); } if ($icoarr['type'] == 'folder') C::t('folder')->update($icoarr['oid'], array('isdelete' => 0)); $return['icoarr'] = C::t('resources')->fetch_by_rid($icoarr['rid']); $return['icoarr']['monthdate'] = dgmdate($return['icoarr']['dateline'], 'm-d'); $return['icoarr']['hourdate'] = dgmdate($return['icoarr']['dateline'], 'H:i'); unset($icoarr); return $return; return array('error' => lang('movement_error') . '!'); } //本地文件复制到本地其它区域 public function FileCopy($rid, $pfid, $first = true,$force=false) { global $_G, $_GET; if (!$tfolder = DB::fetch_first("select * from " . DB::table('folder') . " where fid='{$pfid}'")) { return array('error' => lang('target_location_not_exist')); } if ($icoarr = C::t('resources')->fetch_by_rid($rid)) { unset($icoarr['rid']); //判断当前文件有没有拷贝权限; if(!$force){ if($icoarr['type'] == 'folder'){ $permcheck = C::t('resources')->check_folder_perm($icoarr,'copy'); if($permcheck['error']){ return array('error'=>$permcheck['error']); } }else{ if (!perm_check::checkperm('copy', $icoarr)) { return array('error' => lang('privilege')); } } //判断当前目录有无添加权限 if (!perm_check::checkperm_Container($pfid, 'upload')) { return array('error' => lang('privilege')); } } $success = 0; $gid = DB::result_first("select gid from " . DB::table('folder') . " where fid='{$pfid}'"); $targetpatharr = C::t('resources_path')->fetch_pathby_pfid($pfid,true);//目标路径 $targetpath = $targetpatharr['path']; if ($icoarr['type'] == 'folder') { $foldercontains = C::t('resources')->get_contains_by_fid($icoarr['oid']); if (!SpaceSize($foldercontains['size'], $gid)) { return array('error' => lang('inadequate_capacity_space')); } if ($icoarr['pfid'] == $pfid) {//判断源文件位置和目标位置是否相同,如果相同则生成副本 $icoarr['name'] = $icoarr['name'] . '-副本'; if ($ricoid = self::getRepeatIDByName($icoarr['name'], $pfid, ($icoarr['type'] == 'folder') ? true : false)) {//如果目录下有同名文件 $icoarr['name'] = self::getFolderName($icoarr['name'], $pfid); } } //查询原文件夹是否存在 if ($folder = C::t('folder')->fetch($icoarr['oid'])) { //如果目标目录中有同名文件夹,并且源文件位置和目标位置不在同一目录,则将源文件夹中文件放入该目录下 if ($icoarr['pfid'] != $pfid && $currentinfo = DB::fetch_first("select oid,rid from %t where pfid = %d and `name` = %s and `type` = %s and isdelete < 1", array('resources', $tfolder['fid'], $icoarr['name'], 'folder')) ) { $currentfid = $currentinfo['oid']; //复制源文件夹数据到目标目录同名文件夹 foreach (C::t('resources')->fetch_by_pfid($icoarr['oid']) as $value) { try { self::FileCopy($value['rid'], $currentfid, false); } catch (Exception $e) { } } $data = C::t('resources')->fetch_by_rid($currentinfo['rid']); $return['folderarr'] = $data; $icoarr['rid'] = $data['rid']; } else {//如果目标目录中不存在同名文件夹或者存在同名文件夹而源文件位置和目标位置在同一目录,执行创建 if ($data = self::createFolderByPath($icoarr['name'], $pfid)) {//根据文件夹名字和当前文件夹路径创建文件夹 foreach (C::t('resources')->fetch_by_pfid($folder['fid']) as $value) {//查询原文件夹中文件 try { self::FileCopy($value['rid'], $data['pfid'], false);//复制原文件夹中文件到新文件夹 } catch (Exception $e) { } } $return['folderarr'] = $data['folderarr'][0]; $icoarr['rid'] = $data['icoarr'][0]['rid']; } } } else { return array('error', lang('folder_not_exist')); } } else { //判断空间大小是否足够 if (!SpaceSize($icoarr['size'], $gid)) { return array('error' => lang('inadequate_capacity_space')); } //判断文件名重复 if ($icoarr['pfid'] == $pfid) { $namestr = $icoarr['name']; $ext = ''; $namearr = explode('.', $namestr); if (count($namearr) > 1) { $ext = $namearr[count($namearr) - 1]; unset($namearr[count($namearr) - 1]); $ext = $ext ? ('.' . $ext) : ''; } $tname = implode('.', $namearr); $icoarr['name'] = $tname . '-副本' . $ext; } if ($ricoid = self::getRepeatIDByName($icoarr['name'], $pfid, ($icoarr['type'] == 'folder') ? true : false)) {//如果目录下有同名文件 $icoarr['name'] = self::getFileName($icoarr['name'], $pfid); } $setarr = array( 'name' => $icoarr['name'], 'oid' => $icoarr['oid'], 'uid' => getglobal('uid'), 'username' => getglobal('username'), 'pfid' => $pfid, 'gid' => $tfolder['gid'], 'type' => $icoarr['type'], 'dateline' => TIMESTAMP, 'ext' => $icoarr['ext'], 'size' => $icoarr['size'], 'vid' => 0, ); //新建文件 if ($icoarr['rid'] = C::t('resources')->insert_data($setarr)) { $sourceattrdata = array( 'postip' => $_G['clientip'], 'title' => $setarr['filename'], 'aid' => isset($icoarr['aid']) ? $icoarr['aid'] : '', 'img' => $icoarr['img'], ); if (C::t('resources_attr')->insert_attr($icoarr['rid'], $setarr['vid'], $sourceattrdata)) {//插入属性表 if ($icoarr['aid']) { $attach = C::t('attachment')->fetch($icoarr['aid']); C::t('attachment')->update($icoarr['aid'], array('copys' => $attach['copys'] + 1));//增加使用数 } if ($icoarr['oid']) { $attach = C::t('collect')->fetch($icoarr['oid']); C::t('collect')->update($icoarr['oid'], array('copys' => $attach['copys'] + 1));//增加使用数 } $icoarr['path'] = $targetpath . $setarr['name']; $event = 'creat_file'; $hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($pfid, $setarr['gid']); $eventdata = array( 'title' => $setarr['name'], 'aid' => $icoarr['aid'], 'username' => $setarr['username'], 'uid' => $setarr['uid'], 'position' => preg_replace('/dzz:(.+?):/', '', $targetpath), 'hash' => $hash ); C::t('resources_event')->addevent_by_pfid($pfid, $event, 'create', $eventdata, $setarr['gid'], $icoarr['rid'], $icoarr['name']); } else { C::t('resources')->delete_by_rid($icoarr['rid']); return array('error' => lang('data_error')); } } } if ($icoarr['rid']) { if ($icoarr['size'] > 0) { SpaceSize($icoarr['size'], $gid, 1, $icoarr['uid']); } if (!$first) { //addtoconfig($icoarr); } else { $return['icoarr'] = C::t('resources')->fetch_by_rid($icoarr['rid']); $return['icoarr']['monthdate'] = dgmdate($return['icoarr']['dateline'], 'm-d'); $return['icoarr']['hourdate'] = dgmdate($return['icoarr']['dateline'], 'H:i'); Hook::listen('createafter_addindex',$return['icoarr']); return $return; } } else { return array('error' => lang('files_allowed_copy')); } return array('error' => 'copy error'); } } /* 表单上传文件保存到attachment表,返回attach数组 */ function UploadSave($FILE) { global $_G; $ext = strtolower(substr(strrchr($FILE['name'], '.'), 1)); $target = self::getPath($ext ? ('.' . $ext) : '', 'dzz'); if ($ext && in_array(strtolower($ext), $_G['setting']['unRunExts'])) { $unrun = 1; } else { $unrun = 0; } $filepath = $_G['setting']['attachdir'] . $target; if (!save_to_local($FILE['tmp_name'], $filepath)) { return false; } $md5 = md5_file($filepath); if ($md5 && $attach = DB::fetch_first("select * from " . DB::table('attachment') . " where md5='{$md5}'")) { $attach['filename'] = $FILE['name']; @unlink($filepath); unset($attach['attachment']); return $attach; } else { $remote = 0; $attach = array( 'filesize' => $FILE['size'], 'attachment' => $target, 'filetype' => strtolower($ext), 'filename' => $FILE['name'], 'remote' => $remote, 'copys' => 0, 'md5' => $md5, 'unrun' => $unrun, 'dateline' => $_G['timestamp'], ); if ($attach['aid'] = C::t('attachment')->insert($attach, 1)) { C::t('local_storage')->update_usesize_by_remoteid($attach['remote'], $attach['filesize']); dfsockopen($_G['siteurl'] . 'misc.php?mod=movetospace&aid=' . $attach['aid'] . '&remoteid=0', 0, '', '', FALSE, '', 1); unset($attach['attachment']); return $attach; } else { return false; } } } public function multiUpload($opath, $path, $filename, $attach = array(), $ondup = "newcopy") { /* * 分块上传文件 * param $file:文件路径(可以是url路径,需要服务器开启allow_url_fopen); */ $data = IO::getMeta($opath); if ($data['error']) return $data; $size = $data['size']; if (is_array($filepath = IO::getStream($opath))) { return array('error' => $filepath['error']); } //判断大小 //判断空间大小 $filename = self::name_filter($filename); if (strpos($path, 'dzz::') === false && strpos($path, 'TMP::') === false) { $gid = DB::result_first("select gid from %t where fid=%d", array('folder', $path)); if (!SpaceSize($size, $gid)) { return array('error' => lang('inadequate_capacity_space')); } } if (!$handle = fopen($filepath, 'rb')) { return array('error' => lang('open_file_error')); } if (strpos($path, 'dzz::') !== false || strpos($path, 'TMP::') !== false) { $file = self::getStream($path . '/' . $filename); while (!feof($handle)) { $fileContent = fread($handle, 8192); file_put_contents($file, $fileContent, FILE_APPEND); unset($fileContent); } fclose($handle); return true; } else { $pathinfo = pathinfo($filename); $ext = strtolower($pathinfo['extension']); $target = $this->getPath($ext ? ('.' . $ext) : '', 'dzz'); $file = getglobal('setting/attachdir') . '/' . $target; while (!feof($handle)) { $fileContent = fread($handle, 8192); file_put_contents($file, $fileContent, FILE_APPEND); unset($fileContent); } fclose($handle); } $nfilename = self::getFileName($filename, $path); //重命名 if ($attach = $this->save($target, $nfilename)) { //return array('error'=>json_encode($attach)); if ($attach['error']) { return array('error' => $attach['error']); } else { return $this->uploadToattachment($attach, $path); } } else { return array('error' => 'failure'); } } public function shenpiCreateFile($fid, $path, $attach) { $data = self::createFolderByPath($path, $fid);; return self::uploadToattachment($attach, $data['pfid']); } } ?>