fetch_all_bz();//array('baiduPCS','ALIOSS','dzz','JSS','disk'); if (in_array($bzarr[0], $allowbz)) { $classname = 'io_' . $bzarr[0]; } else{ $classname = 'io_dzz'; } return new $classname($path); } function MoveToSpace($path, $attach, $ondup = 'overwrite') { $path = self::clean($path); if ($io = self::initIO($path)) { return $io->MoveToSpace($path, $attach, $ondup); } else { return false; } } function authorize($bz, $refer = '') { if ($io = self::initIO($bz)) { $io->authorize($refer); } } function getQuota($bz) { if ($io = self::initIO($bz)) { return $io->getQuota($bz); } else { return false; } } function chmod($path, $chmod, $son = 0) { if ($io = self::initIO($path)) { return $io->chmod($path, $chmod, $son); } else { return false; } } function parsePath($path) { $path = self::clean($path); if ($io = self::initIO($path)) { return $io->parsePath($path); } else { return false; } } function output_thumb($file, $mine = 'image/JPEG') {//根据文件地址,输出图像流 global $_G; $last_modified_time = filemtime($file); if ($last_modified_time) { $etag = md5_file($file); header("Last-Modified: " . gmdate("D, d M Y H:i:s", $last_modified_time) . " GMT"); header("Etag: $etag"); if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time || trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag ) { header("HTTP/1.1 304 Not Modified"); exit; } } /*if(!$last_modified_time) $last_modified_time = TIMESTAMP;*/ @header('cache-control:public'); header('Content-Type: ' . $mine); @ob_end_clean(); if (getglobal('gzipcompress')) @ob_start('ob_gzhandler'); @readfile($file); @flush(); @ob_flush(); exit(); } //获取缩略图 function getThumb($path, $thumbsign, $original, $returnurl = false, $create = 0, $thumbtype = 1, $extpramas = array()) { $path = self::clean($path); if ($io = self::initIO($path)) return $io->getThumb($path, $thumbsign, $original, $returnurl, $create, $thumbtype, $extpramas); } function getPreviewThumb($path, $thumbsign, $original, $returnurl = false, $create = 0, $thumbtype = 1, $extpramas = array()){ $path = self::clean($path); if ($io = self::initIO($path)) return $io->getPreviewThumb($path, $thumbsign, $original, $returnurl, $create, $thumbtype, $extpramas); } //获取文件信息 function getfilesinfo($path){ $path = self::clean($path); if ($io = self::initIO($path)) return $io->getfilesinfo($path); } function createThumbByOriginal($path,$data, $width, $height, $thumbtype = 1, $original = 0, $extraparams = array(),$filesize=0) { $path = self::clean($path); if ($io = self::initIO($path)) return $io->createThumbByOriginal($path,$data,$width, $height, $thumbtype, $original, $extraparams,$filesize); } function gettmpThumb($path, $width = 0, $height = 0, $returnurl = false, $thumbtype = 1, $extraparams = array()){ $path = self::clean($path); if ($io = self::initIO($path)) return $io->gettmpThumb($path,$width, $height,$returnurl, $thumbtype, $extraparams); } /* *通过icosdata获取folderdata数据 */ function getFolderByIcosdata($icosdata) { if ($io = self::initIO($icosdata['path'])) return $io->getFolderByIcosdata($icosdata); else return false; } //获取icosdata数组; //$path: 路径 //$getimagedata 是否获取图片宽高等数据 //$bz==''是表示获取的是本地;此时path为icoid; function getMeta($path, $getimagedata = 0) { $path = self::clean($path); if ($io = self::initIO($path)) return $io->getMeta($path, $getimagedata); else return false; } //重命名文件 function rename($path, $newname) { $path = self::clean($path); $newname = self::name_filter($newname); if ($io = self::initIO($path)) { $return = $io->rename($path, $newname); //Hook::listen('renameafter_updateindex',$return); return $return; } else return false; } //根据路径获取目录树的数据; function getFolderDatasByPath($path) { $path = self::clean($path); if ($io = self::initIO($path)) return $io->getFolderDatasByPath($path); else return false; } //判断文件或目录是否存在 public function checkfileexists($path,$isdir = false){ $io = self::initIO($path); if ($io){ $path = self::clean($path); return $io->checkfileexists($path,$isdir); } else return false; } //获取文件时间 public function getFimemtime($path){ $io = self::initIO($path); if ($io){ $path = self::clean($path); return $io->getFimemtime($path); } else return false; } //获取文件流; //$path: 路径 public function getStream($path, $fop = 0) { $io = self::initIO($path); if ($io){ $path = self::clean($path); return $io->getStream($path, $fop); } else return $path; } //获取文件地址; //$path: 路径 function getFileUri($path, $fop = 0) { $path = self::clean($path); if ($io = self::initIO($path)) return $io->getFileUri($path, $fop); else return $path; } function getFolderlist($path, $nextmarker = '',$by = 'time',$order = 'DESC', $limit = 1000, $force = 0) { $path = self::clean($path); if ($io = self::initIO($path)) return $io->getFolderlist($path, $nextmarker,$by, $order, $limit, $force); else return false; } /** * 获取指定文件夹下的文件列表 * @param string $path 文件路径 * @param string $by 排序字段,缺省根据文件类型排序,time(修改时间),name(文件名),size(大小,注意目录无大小) * @param string $order asc或desc,缺省采用降序排序 * @param string $limit 返回条目控制,参数格式为:n1-n2。返回结果集的[n1, n2)之间的条目,缺省返回所有条目。n1从0开始。 * @param string $force 读取缓存,大于0:忽略缓存,直接调用api数据,常用于强制刷新时。 * @return icosdatas */ function listFiles($path, $nextmarker = '',$by = 'time',$order = 'DESC', $limit = 1000, $force = 0) { $path = self::clean($path); if ($io = self::initIO($path)) return $io->listFiles($path, $nextmarker,$by,$order, $limit, $force); else return false; } //目标位置新建内容 //$path:原路径 //$container:目标位置; //$tbz:目标api; //返回: //$icosdata数组; function CopyTo($opath, $path, $iscopy = 0, $force = 0) { $path = self::clean($path); $opath = self::clean($opath); if ($io = self::initIO($opath)) return $io->CopyTo($opath, $path, $iscopy, $force); else return false; } /** * 删除指定的元素 * @param string $opath 被移动的文件路径 * @param string $path 目标位置(可能是同一api内或跨api,这两种情况分开处理) * @return icosdatas */ public function DeleteByData($data, $force = false) { $havesubitem = 0; if (isset($data['contents'])) { foreach ($data['contents'] as $key => $value) { $return = self::DeleteByData($value); if (intval($return['delete']) < 1) { $havesubitem = 1; } $data['contents'][$key] = $return; } } if ($data['success'] === true && !$havesubitem) { if ($data['icoid'] == $data['newdata']['icoid']) { $data['newdata']['move'] = 1; } else { $arr = IO::Delete($data['path']); if ($arr['icoid']) $data['delete'] = 1; else $data['success'] = $arr['error']; } } return $data; } //添加目录 //$fname:目录名称; //$path:目录位置路径,如果是本地,$path 为pfid function CreateFolder($path, $fname, $perm = 0, $params = array(), $ondup = 'newcopy', $force = false) { $path = self::clean($path);//11 $fname = self::name_filter($fname); if ($io = self::initIO($path)) { $return = $io->CreateFolder($path, $fname, $perm, $params, $ondup, $force); if (isset($return['icoarr'])) { //Hook::listen('createFolder_after',$return['icoarr']); Hook::listen('createafter_addindex_getvideo', $return['icoarr']); Hook::listen('createafter_addindex', $return['icoarr']); } return $return; } else return false; } //添加多层目录 //$fid:父级目录id; //$path:目录位置路径,如aaa/bbb/ccc function CreateFolderByPath($path, $fid, $bz = 'dzz', $params = array()) { $path = self::clean($path); if ($io = self::initIO($bz)) { return $io->CreateFolderByPath($path, $fid, $params); } else return false; } /*将文件缓存到本地,并且返回本地的访问地址*/ function cacheFile($data) { global $_G; $subdir = $subdir1 = $subdir2 = ''; $subdir1 = date('Ym'); $subdir2 = date('d'); $subdir = $subdir1 . '/' . $subdir2 . '/'; $target1 = 'dzzcache/' . $subdir . 'index.html'; $target = 'dzzcache/' . $subdir . random(10); $target_attach = $_G['setting']['attachdir'] . $target1; $targetpath = dirname($target_attach); dmkdir($targetpath); if (file_put_contents($target, $data)) { return $target; } else { return false; } } //获取文件数据 //$data:文件的信息数组 //返回我文件data; function getFileContent($path) { $path = self::clean($path); if ($io = self::initIO($path)) return $io->getFileContent($path); else return false; } //覆盖文件内容 //$data:文件的信息数组 //返回我文件data; function setFileContent($path, $data, $force = false, $nocover = true) { $path = self::clean($path); if ($io = self::initIO($path)) { if ($data = $io->setFileContent($path, $data, $force, $nocover)) { $filedata = $data; \Hook::listen('setfilecontent_after', $filedata); return $data; } else { return false; } } else return false; } //分片上传文件; //$path: 路径 function multiUpload($file, $path, $filename, $attach = array(), $ondup = "newcopy") { $path = self::clean($path); $filename = self::name_filter($filename); if ($io = self::initIO($path)) return $io->multiUpload($file, $path, $filename, $attach, $ondup); else return false; } //添加文件 //$fileContent:源文件数据; //$container:目标位置; //$bz:api; function upload($fileContent, $path, $filename) { $path = self::clean($path); $filename = self::name_filter($filename); if ($io = self::initIO($path)) { $return = $io->upload($fileContent, $path, $filename); return $return; } else return false; } function upload_by_content($fileContent, $path, $filename, $partinfo = array()) { $path = self::clean($path); $filename = self::name_filter($filename); if ($io = self::initIO($path)) { $return = $io->upload_by_content($fileContent, $path, $filename, $partinfo); Hook::listen('createafter_addindex_getvideo', $return); Hook::listen('createafter_addindex', $return); return $return; } else return false; } public function uploadByStream($path,$filename,$file,$fid,$relativePath='',$nohook=0){ $path = self::clean(urldecode($path)); $name = self::name_filter(urldecode($filename)); $relativePath = self::clean(urldecode($relativePath)); if ($io = self::initIO($path)) { $return = $io->uploadByStream($path, $name, $file, $fid,$relativePath,$nohook); if ($return['icoarr'] && !$nohook) { foreach ($return['icoarr'] as $v) { $tmpdata = $v; Hook::listen('createafter_addindex_getvideo', $tmpdata); Hook::listen('createafter_addindex', $tmpdata); } } return $return; } else return false; } //public function uploadStream($file, $name, $path, $relativePath = '', $content_range = '') public function uploadStream($file, $name, $appid, $pfid = '', $relativePath = '', $content_range = array(), $params = array()) { $path = self::clean(urldecode($file)); $name = self::name_filter(urldecode($name)); $relativePath = self::clean(urldecode($relativePath)); if ($io = self::initIO($path)) { $return = $io->uploadStream($file, $name, $appid,$pfid, $relativePath, $content_range,$params); if ($return['icoarr']) { foreach ($return['icoarr'] as $v) { $hookdata = $v; //Hook::listen('pichomeconvert',$tmpdata); Hook::listen("addfileafter",$hookdata); } } return $return; } else return false; } function Delete($path, $isdir = false) { $path = self::clean($path); if ($io = self::initIO($path)) { $return = $io->Delete($path, $isdir); return $return; } else return false; } //恢复文件 function Recover($path, $combine = true, $force = false) { $path = self::clean($path); if ($io = self::initIO($path)) { return $io->Recover($path, $combine, $force); } else return false; } //获取不重复的目录名称 public function getFolderName($fname, $path) { $path = self::clean($path); $fname = self::name_filter($fname); if ($io = self::initIO($path)) return $io->getFolderName($fname, $path); else return false; } public function download($paths, $filename = '', $checkperm = 'download', $param = array()) { $paths = (array)$paths; $paths = self::clean($paths); if ($io = self::initIO($paths[0])) return $io->download($paths, $filename, $checkperm, $param); else return false; } public function localdownload($paths, $filename = '', $checkperm = 'download', $param = array()) { $paths = (array)$paths; $paths = self::clean($paths); if ($io = self::initIO($paths[0])) return $io->localdownload($paths, $filename, $checkperm, $param); else return false; } public function getCloud($bz) { $bzarr = explode(':', $bz); $cloud = DB::fetch_first("select * from " . DB::table('connect') . " where bz='{$bzarr[0]}'"); if ($cloud['type'] == 'pan') { $root = DB::fetch_first("select * from " . DB::table($cloud['dname']) . " where id='{$bzarr[1]}'"); if (!$root['cloudname']) $root['cloudname'] = $cloud['name'] . ':' . ($root['cusername'] ? $root['cusername'] : $root['cuid']); } elseif ($cloud['type'] == 'storage') { $root = DB::fetch_first("select * from " . DB::table($cloud['dname']) . " where id='{$bzarr[1]}'"); $root['access_id'] = authcode($root['access_id'], 'DECODE', $root['bz']); if (!$root['cloudname']) $root['cloudname'] = $cloud['name'] . ':' . ($root['bucket'] ? $root['bucket'] : cutstr($root['access_id'], 4, $dot = '')); } elseif ($cloud['type'] == 'ftp') { $root = DB::fetch_first("select * from " . DB::table($cloud['dname']) . " where id='{$bzarr[1]}'"); } elseif ($cloud['type'] == 'disk') { $root = DB::fetch_first("select * from " . DB::table($cloud['dname']) . " where id='{$bzarr[1]}'"); } else { $root = DB::fetch_first("select * from " . DB::table($cloud['dname']) . " where id='{$bzarr[1]}'"); } $root['cloudtype'] = $cloud['type']; return $root; } public function clean($str) {//清除路径 if(is_array($str)){ foreach($str as $key=> $value){ $str[$key]=self::clean_path(str_replace(array( "\n", "\r", '../'), '', $value)); } }else{ $str= self::clean_path(str_replace(array( "\n", "\r", '../'), '', $str)); } return $str; } private function clean_path($str){ if(preg_match("/\.\.\//",$str)){ $str=str_replace('../','',$str); return self::clean_path($str); }else{ return $str; } } public function name_filter($name) { return str_replace(array('/', '\\', ':', '*', '?', '<', '>', '|', '"', "\n"), '', $name); } public function saveToAttachment($file_path, $filename, $tospace = 1, $width = 256, $height = 256, $deletesource = 1) { $md5 = md5_file($file_path); $filesize = filesize($file_path); 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'] = $ext; if (in_array(strtolower($attach['filetype']), array('png', 'jpeg', 'jpg', 'gif', 'bmp'))) { $attach['img'] = C::t('attachment')->getThumbByAid($attach, $width, $height); $attach['isimage'] = 1; } else { //$attach['img']=geticonfromext($ext); $attach['isimage'] = 0; } //$attach['ffilesize']=formatsize($tattach['filesize']); if ($deletesource) @unlink($file_path); return $attach; } else { $target = self::getPath($filename); $pathinfo = pathinfo($filename); $ext = $pathinfo['extension'] ? $pathinfo['extension'] : ''; if ($ext && in_array(strtolower($ext), getglobal('setting/unRunExts'))) { $unrun = 1; } else { $unrun = 0; } $filepath = getglobal('setting/attachdir') . $target; $handle = fopen($file_path, 'r'); $handle1 = fopen($filepath, 'w'); while (!feof($handle)) { fwrite($handle1, fread($handle, 8192)); } fclose($handle); fclose($handle1); if ($deletesource) @unlink($file_path); $filesize = filesize($filepath); $remote = 0; $attach = array( 'filesize' => $filesize, 'attachment' => $target, 'filetype' => strtolower($ext), 'filename' => $filename, 'remote' => 1, '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']); if ($tospace) dfsockopen(getglobal('localurl') . 'misc.php?mod=movetospace&aid=' . $attach['aid'] . '&remoteid=0', 0, '', '', FALSE, '', 1); if (in_array(strtolower($attach['filetype']), array('png', 'jpeg', 'jpg', 'gif', 'bmp'))) { $attach['img'] = C::t('attachment')->getThumbByAid($attach['aid'], $width, $height); $attach['isimage'] = 1; } else { $attach['img'] = geticonfromext($ext); $attach['isimage'] = 0; } //$attach['ffilesize']=formatsize($tattach['filesize']); return $attach; } else { return false; } } } public function getPath($filename, $dir = 'dzz') { $pathinfo = pathinfo($filename); $ext = $pathinfo['extension'] ? ($pathinfo['extension']) : ''; if ($ext && in_array(strtolower($ext), getglobal('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 = getglobal('setting/attachdir') . $target1; $targetpath = dirname($target_attach); dmkdir($targetpath); return $target . date('His') . '' . strtolower(random(16)) . '.' . $ext; } //获取水印图地址 public function getwaterimg($path){ $path = self::clean($path); if ($io = self::initIO($path)) { $return = $io->getwaterimg($path); return $return; } else return false; } //移动云端文件到上传区 public function movetmpdataToattachment($path, $data) { $path = self::clean($path); if ($io = self::initIO($path)) { $return = $io->movetmpdataToattachment($path, $data); if ($return['icoarr']) { foreach ($return['icoarr'] as $v) { $hookdata = $v; //Hook::listen('pichomeconvert',$tmpdata); Hook::listen("addfileafter",$hookdata); } } return $return; } else return false; } //移动文件到下载缓冲区 public function moveFileToDownload($path, $filepath) { $path = self::clean($path); if ($io = self::initIO($path)) { $return = $io->moveFileToDownload($path, $filepath); return $return; } else return false; } //移动缩略图到目标位置 public function moveThumbFile($path, $filepath) { $path = self::clean($path); if ($io = self::initIO($path)) { $return = $io->moveThumbFile($path, $filepath); return $return; } else return false; } } ?>