mirror of
https://github.com/zyx0814/dzzoffice.git
synced 2025-04-04 22:33:37 +08:00
2955 lines
136 KiB
PHP
2955 lines
136 KiB
PHP
<?php
|
||
/*
|
||
* @copyright Leyun internet Technology(Shanghai)Co.,Ltd
|
||
* @license http://www.dzzoffice.com/licenses/license.txt
|
||
* @package DzzOffice
|
||
* @link http://www.dzzoffice.com
|
||
* @author zyx(zyx@dzz.cc)
|
||
*/
|
||
|
||
if (!defined('IN_DZZ')) {
|
||
exit('Access Denied');
|
||
}
|
||
@set_time_limit(0);
|
||
@ini_set('max_execution_time', 0);
|
||
|
||
class io_dzz extends io_api
|
||
{
|
||
public function listFiles($rid, $by = 'name', $asc = 'DESC', $limit = 0, $force = 0)
|
||
{
|
||
$data = array();
|
||
$icoarr = C::t('resources_path')->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, 'preview_') === 0) {
|
||
$path = preg_replace('/^preview_/', '', $path);
|
||
}
|
||
// 检查是否以 'sid:' 开头并以 '_' 结尾
|
||
if (preg_match('/^sid:([^\_]+)_/', $path, $matches)) {
|
||
// 提取 sid 后面的值
|
||
$sid = $matches[1];
|
||
// 去掉 sid 及其值
|
||
$path = preg_replace('/^sid:[^\_]+_/', '', $path);
|
||
}
|
||
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'] == 'dzzdoc' || $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'] == 'dzzdoc' || $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, 'preview_') === 0) {
|
||
$path = preg_replace('/^preview_/', '', $path);
|
||
}
|
||
// 检查是否以 'sid:' 开头并以 '_' 结尾
|
||
if (preg_match('/^sid:([^\_]+)_/', $path, $matches)) {
|
||
// 去掉 sid 及其值
|
||
$path = preg_replace('/^sid:[^\_]+_/', '', $path);
|
||
}
|
||
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'] == 'dzzdoc' || $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']));
|
||
if ($data['ext'] == 'png' || $data['ext'] == 'PNG') {
|
||
$targetext = '.png';
|
||
} else {
|
||
$targetext = '.jpeg';
|
||
}
|
||
$target = $imgcachePath . ($cachepath) . '.' . $width . '_' . $height . '_'.$thumbtype.$targetext;
|
||
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();
|
||
}
|
||
//@param number $rid 文件的rid
|
||
//@param string $message 文件的新内容
|
||
public function setFileContent($rid, $fileContent, $force = false, $nocover = true)
|
||
{
|
||
global $_G;
|
||
if (strpos($rid, 'preview_') === 0) {
|
||
$rid = preg_replace('/^preview_/', '', $rid);
|
||
}
|
||
// 检查是否以 'sid:' 开头并以 '_' 结尾
|
||
if (preg_match('/^sid:([^\_]+)_/', $rid, $matches)) {
|
||
// 提取 sid 后面的值
|
||
$sid = $matches[1];
|
||
// 去掉 sid 及其值
|
||
$rid = preg_replace('/^sid:[^\_]+_/', '', $rid);
|
||
}
|
||
if (!$icoarr = C::t('resources')->fetch_by_rid($rid,'',$preview,$sid)) {
|
||
return array('error' => lang('file_not_exist'));
|
||
}
|
||
if ($icoarr['isdelete']) {
|
||
return array('error' => lang('file_been_deleted'));
|
||
}
|
||
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']));
|
||
$editperm = perm_check::checkperm('edit', $icoarr);
|
||
if (!$force && !$editperm) {
|
||
return array('error' => lang('file_edit_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'] ? $_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,$editperm);
|
||
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, 'preview_') === 0) {
|
||
$icoid = preg_replace('/^preview_/', '', $icoid);
|
||
$preview = true;
|
||
}
|
||
// 检查是否以 'sid:' 开头并以 '_' 结尾
|
||
if (preg_match('/^sid:([^\_]+)_/', $icoid, $matches)) {
|
||
// 提取 sid 后面的值
|
||
$sid = $matches[1];
|
||
// 去掉 sid 及其值
|
||
$icoid = preg_replace('/^sid:[^\_]+_/', '', $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,'',$preview,$sid);
|
||
} elseif (preg_match('/\w{32}/i', $icoid)) {
|
||
return C::t('resources')->fetch_by_rid($icoid,'',$preview,$sid);
|
||
} 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, 'preview_') === 0) {
|
||
$path = preg_replace('/^preview_/', '', $path);
|
||
}
|
||
// 检查是否以 'sid:' 开头并以 '_' 结尾
|
||
if (preg_match('/^sid:([^\_]+)_/', $path, $matches)) {
|
||
// 去掉 sid 及其值
|
||
$path = preg_replace('/^sid:[^\_]+_/', '', $path);
|
||
}
|
||
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, 'preview_') === 0) {
|
||
$path = preg_replace('/^preview_/', '', $path);
|
||
}
|
||
// 检查是否以 'sid:' 开头并以 '_' 结尾
|
||
if (preg_match('/^sid:([^\_]+)_/', $path, $matches)) {
|
||
// 去掉 sid 及其值
|
||
$path = preg_replace('/^sid:[^\_]+_/', '', $path);
|
||
}
|
||
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', 'webp');
|
||
//图片文件时
|
||
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'],
|
||
|
||
);
|
||
|
||
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'],
|
||
|
||
);
|
||
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) : '';
|
||
$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']);
|
||
} 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', 'dzzdoc'))) {
|
||
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 {
|
||
if (strpos($rid, 'preview_') === 0) {
|
||
$rid = preg_replace('/^preview_/', '', $rid);
|
||
$preview = true;
|
||
}
|
||
// 检查是否以 'sid:' 开头并以 '_' 结尾
|
||
if (preg_match('/^sid:([^\_]+)_/', $rid, $matches)) {
|
||
// 提取 sid 后面的值
|
||
$sid = $matches[1];
|
||
// 去掉 sid 及其值
|
||
$rid = preg_replace('/^sid:[^\_]+_/', '', $rid);
|
||
}
|
||
$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,$preview,$sid);
|
||
$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,$preview = false,$sid = 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,'',$preview,$sid)) {
|
||
|
||
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,$preview,$sid);
|
||
} 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,$sid,$sid);//复制原文件夹中文件到新文件夹
|
||
} 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, 'preview_') === 0) {
|
||
$path = preg_replace('/^preview_/', '', $path);
|
||
}
|
||
// 检查是否以 'sid:' 开头并以 '_' 结尾
|
||
if (preg_match('/^sid:([^\_]+)_/', $path, $matches)) {
|
||
// 去掉 sid 及其值
|
||
$path = preg_replace('/^sid:[^\_]+_/', '', $path);
|
||
}
|
||
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']);
|
||
}
|
||
}
|
||
|
||
?>
|