123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640 |
- <?php
- class attachment
- {
- var $contentid;
- var $module;
- var $catid;
- var $attachments;
- var $field;
- var $imageexts = array('xls,xlsx');
- var $alowexts = array();
- var $uploadedfiles = array();
- var $downloadedfiles = array();
- var $error;
- var $upload_root;
- var $siteid;
- var $site = array();
- var $upload_dir;
- var $uploadeds;
- function __construct($catid = 0, $upload_dir = 'data/')
- {
- $this->catid = intval($catid);
- // $this->siteid = intval($siteid) == 0 ? 1 : intval($siteid);
- // $this->module = $module ? $module : 'content';
- // pc_base::load_sys_func('dir');
- // pc_base::load_sys_class('image', '', '0');
- $this->upload_root = Doo::conf()->SITE_PATH;
- $this->upload_func = 'move_uploaded_file';
- // $this->upload_func = 'copy';
- $this->upload_dir = $upload_dir;
- }
- function setUploadDir($upload_dir = 'files/')
- {
- $this->upload_dir = $upload_dir;
- }
- /**
- * 附件上传方法
- * @param $field 上传字段
- * @param $alowexts 允许上传类型
- * @param $maxsize 最大上传大小
- * @param $overwrite 是否覆盖原有文件
- * @param $thumb_setting 缩略图设置
- * @param $watermark_enable 是否添加水印
- */
- function upload($field, $alowexts = '', $maxsize = 0, $overwrite = 0, $thumb_setting = array(), $watermark_enable = 1, $ip = '')
- {
- if (!isset($_FILES[$field])) {
- $this->error = UPLOAD_ERR_OK;
- return false;
- }
- $this->field = $field;
- $this->savepath = $this->upload_root . $this->upload_dir . date('Y/md/');
- $this->alowexts = $alowexts;
- $this->maxsize = $maxsize;
- $this->overwrite = $overwrite;
- $uploadfiles = array();
- $description = isset($GLOBALS[$field . '_description']) ? $GLOBALS[$field . '_description'] : array();
- // $this->uploads = count($_FILES[$field]['error']);
- // if ($this->uploads >= 2) {
- if (is_array($_FILES[$field]['error'])) {
- $this->uploads = count($_FILES[$field]['error']);
- foreach ($_FILES[$field]['error'] as $key => $error) {
- if ($error === UPLOAD_ERR_NO_FILE)
- continue;
- if ($error !== UPLOAD_ERR_OK) {
- $this->error = $error;
- return false;
- }
- $uploadfiles[$key] = array('tmp_name' => $_FILES[$field]['tmp_name'][$key], 'name' => $_FILES[$field]['name'][$key], 'type' => $_FILES[$field]['type'][$key], 'size' => $_FILES[$field]['size'][$key], 'error' => $_FILES[$field]['error'][$key], 'description' => $description[$key]);
- }
- } else {
- $this->uploads = 1;
- if (!$description)
- $description = '';
- $uploadfiles[0] = array('tmp_name' => $_FILES[$field]['tmp_name'], 'name' => $_FILES[$field]['name'], 'type' => $_FILES[$field]['type'], 'size' => $_FILES[$field]['size'], 'error' => $_FILES[$field]['error'], 'description' => $description);
- }
- if (!$this->dir_create($this->savepath)) {
- $this->error = '8';
- return false;
- }
- if (!is_dir($this->savepath)) {
- $this->error = '8';
- return false;
- }
- @chmod($this->savepath, 0777);
- if (!is_writeable($this->savepath)) {
- $this->error = '9';
- return false;
- }
- // if (!$this->is_allow_upload()) {
- // $this->error = '13';
- // return false;
- // }
- $aids = array();
- foreach ($uploadfiles as $k => $file) {
- $fileext = $this->fileext($file['name']);
- if ($file['error'] != 0) {
- $this->error = $file['error'];
- return false;
- }
- // if (!preg_match("/^(" . $this->alowexts . ")$/", $fileext)) {
- // $this->error = '10';
- // return false;
- // }
- if ($this->maxsize && $file['size'] > $this->maxsize) {
- $this->error = '11';
- return false;
- }
- if (!$this->isuploadedfile($file['tmp_name'])) {
- $this->error = '12';
- return false;
- }
- $temp_filename = $this->getname($fileext);
- $savefile = $this->savepath . $temp_filename;
- $savefile = preg_replace("/(php|phtml|php3|php4|jsp|exe|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(\.|$)/i", "_\\1\\2", $savefile);
- $filepath = preg_replace($this->new_addslashes("|^" . $this->upload_root . "|"), "", $savefile);
- if (!$this->overwrite && file_exists($savefile))
- continue;
- $upload_func = $this->upload_func;
- if ($upload_func($file['tmp_name'], $savefile)) {
- // $this->uploadeds++;
- @chmod($savefile, 0777);
- @unlink($file['tmp_name']);
- // $file['name'] = iconv("utf-8", 'sdsdf', $file['name']);
- $uploadedfile = array('filename' => $file['name'], 'filepath' => $filepath, 'filesize' => $file['size'], 'fileext' => $fileext, 'uploadip' => $ip, 'uploadtime' => time());
- // error_log(var_export($uploadedfile, TRUE), 3, '/opt/WebRoot/wenku/data/upArray.txt');
- // $thumb_enable = is_array($thumb_setting) && ($thumb_setting[0] > 0 || $thumb_setting[1] > 0 ) ? 1 : 0;
- // $image = new image($thumb_enable, $this->siteid);
- // if ($thumb_enable) {
- // $image->thumb($savefile, '', $thumb_setting[0], $thumb_setting[1]);
- // }
- // if ($watermark_enable) {
- // $image->watermark($savefile, $savefile);
- // }
- // $aids[] = $this->add($uploadedfile);
- }
- }
- return $uploadedfile;
- }
- /**
- * 附件上传方法
- * @param $field 上传字段
- * @param $alowexts 允许上传类型
- * @param $maxsize 最大上传大小
- * @param $overwrite 是否覆盖原有文件
- */
- function uploadMut($field, $alowexts = '', $maxsize = 0, $overwrite = 0)
- {
- if (!isset($_FILES[$field])) {
- $this->error = UPLOAD_ERR_OK;
- return false;
- }
- $this->field = $field;
- $this->savepath = $this->upload_root . $this->upload_dir . date('Y/md/');
- $this->alowexts = $alowexts;
- $this->maxsize = $maxsize;
- $this->overwrite = $overwrite;
- $uploadfiles = array();
- $description = isset($GLOBALS[$field . '_description']) ? $GLOBALS[$field . '_description'] : array();
- if (is_array($_FILES[$field]['error'])) {
- $this->uploads = count($_FILES[$field]['error']);
- foreach ($_FILES[$field]['error'] as $key => $error) {
- if ($error === UPLOAD_ERR_NO_FILE)
- continue;
- if ($error !== UPLOAD_ERR_OK) {
- $this->error = $error;
- return false;
- }
- $uploadfiles[$key] = array('tmp_name' => $_FILES[$field]['tmp_name'][$key], 'name' => $_FILES[$field]['name'][$key], 'type' => $_FILES[$field]['type'][$key], 'size' => $_FILES[$field]['size'][$key], 'error' => $_FILES[$field]['error'][$key]);
- }
- } else {
- $this->uploads = 1;
- if (!$description)
- $description = '';
- $uploadfiles[0] = array('tmp_name' => $_FILES[$field]['tmp_name'], 'name' => $_FILES[$field]['name'], 'type' => $_FILES[$field]['type'], 'size' => $_FILES[$field]['size'], 'error' => $_FILES[$field]['error'], 'description' => $description);
- }
- if (!$this->dir_create($this->savepath)) {
- $this->error = '8';
- return false;
- }
- if (!is_dir($this->savepath)) {
- $this->error = '8';
- return false;
- }
- // @chmod($this->savepath, 0777);
- if (!is_writeable($this->savepath)) {
- $this->error = '9';
- return false;
- }
- $aids = array();
- foreach ($uploadfiles as $k => $file) {
- $fileext = $this->fileext2($file['name']);
- if ($file['error'] != 0) {
- $this->error = $file['error'];
- // echo $this->error;
- return false;
- }
- // if (!preg_match("/^(" . $this->alowexts . ")$/", $fileext)) {
- // $this->error = '10';
- // echo $this->error;
- // return false;
- // }
- if ($this->maxsize && $file['size'] > $this->maxsize) {
- $this->error = '11';
- // echo $this->error;
- return false;
- }
- if (!$this->isuploadedfile($file['tmp_name'])) {
- $this->error = '12';
- // echo $this->error;
- return false;
- }
- $temp_filename = $this->getname($fileext);
- $savefile = $this->savepath . $temp_filename;
- $savefile = preg_replace("/(php|phtml|php3|php4|jsp|exe|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(\.|$)/i", "_\\1\\2", $savefile);
- $filepath = preg_replace($this->new_addslashes("|^" . $this->upload_root . "|"), "", $savefile);
- if (!$this->overwrite && file_exists($savefile))
- continue;
- $upload_func = $this->upload_func;
- if (@$upload_func($file['tmp_name'], $savefile)) {
- $this->uploadeds++;
- @chmod($savefile, 0777);
- @unlink($file['tmp_name']);
- $file['name'] = $this->safe_replace($file['name']);
- $uploadedfile = array('filename' => trim($file['name']), 'filepath' => $filepath, 'filesize' => $file['size'], 'fileext' => $fileext);
- $aids[] = $uploadedfile;
- }
- }
- return $aids;
- }
- /**
- * 取得文件扩展
- *
- * @param $filename 文件名
- * @return 扩展名
- */
- function fileext2($filename)
- {
- return strtolower(trim(substr(strrchr($filename, '.'), 1, 10)));
- }
- /**
- * 安全过滤函数
- *
- * @param $string
- * @return string
- */
- function safe_replace($string)
- {
- $string = str_replace('%20', '', $string);
- $string = str_replace('%27', '', $string);
- $string = str_replace('%2527', '', $string);
- $string = str_replace('*', '', $string);
- $string = str_replace('"', '"', $string);
- $string = str_replace("'", '', $string);
- $string = str_replace('"', '', $string);
- $string = str_replace(';', '', $string);
- $string = str_replace('<', '<', $string);
- $string = str_replace('>', '>', $string);
- $string = str_replace("{", '', $string);
- $string = str_replace('}', '', $string);
- return $string;
- }
- /**
- * 返回经addslashes处理过的字符串或数组
- * @param $string 需要处理的字符串或数组
- * @return mixed
- */
- function new_addslashes($string)
- {
- if (!is_array($string))
- return addslashes($string);
- foreach ($string as $key => $val)
- $string[$key] = new_addslashes($val);
- return $string;
- }
- /**
- * 取得文件扩展
- *
- * @param $filename 文件名
- * @return 扩展名
- */
- function fileext($filename)
- {
- $pathinfo = pathinfo($filename);
- // return strtolower(trim(substr(mb_strrchr($filename, '.'), 1, 10)));
- return $pathinfo['extension'];
- }
- /**
- * 创建目录
- *
- * @param string $path 路径
- * @param string $mode 属性
- * @return string 如果已经存在则返回true,否则为flase
- */
- function dir_create($path, $mode = 0777)
- {
- if (is_dir($path))
- return TRUE;
- // $ftp_enable = 0;
- $path = $this->dir_path($path);
- $parent = dirname($path);
- if (!is_dir($parent))
- @mkdir($parent, 0777, true);
- @mkdir($path, 0777, true);
- // $temp = explode('/', $path);
- // $cur_dir = '';
- // $max = count($temp) - 1;
- // for ($i = 0; $i < $max; $i++) {
- // if (empty($temp[$i]))
- // continue;
- // $cur_dir .= $temp[$i] . '/';
- // if (@is_dir($cur_dir))
- // continue;
- //// error_log($cur_dir, 3, '/opt/WebRoot/wenku/data/4mkdir.txt');
- // @mkdir($cur_dir, 0777, true);
- // @chmod($cur_dir, 0777);
- // }
- return is_dir($path);
- }
- /**
- * 转化 \ 为 /
- *
- * @param string $path 路径
- * @return string 路径
- */
- function dir_path($path)
- {
- $path = str_replace('\\', '/', $path);
- if (substr($path, -1) != '/')
- $path = $path . '/';
- return $path;
- }
- /**
- * 附件下载
- * Enter description here ...
- * @param $field 预留字段
- * @param $value 传入下载内容
- * @param $watermark 是否加入水印
- * @param $ext 下载扩展名
- * @param $absurl 绝对路径
- * @param $basehref
- */
- function download($field, $value, $watermark = '0', $ext = 'gif|jpg|jpeg|bmp|png', $absurl = '', $basehref = '')
- {
- global $image_d;
- $this->att_db = pc_base::load_model('attachment_model');
- $upload_url = pc_base::load_config('system', 'upload_url');
- $this->field = $field;
- $dir = date('Y/md/');
- $uploadpath = $upload_url . $dir;
- $uploaddir = $this->upload_root . $dir;
- $string = new_stripslashes($value);
- if (!preg_match_all("/(href|src)=([\"|']?)([^ \"'>]+\.($ext))\\2/i", $string, $matches))
- return $value;
- $remotefileurls = array();
- foreach ($matches[3] as $matche) {
- if (strpos($matche, '://') === false)
- continue;
- dir_create($uploaddir);
- $remotefileurls[$matche] = $this->fillurl($matche, $absurl, $basehref);
- }
- unset($matches, $string);
- $remotefileurls = array_unique($remotefileurls);
- $oldpath = $newpath = array();
- foreach ($remotefileurls as $k => $file) {
- if (strpos($file, '://') === false || strpos($file, $upload_url) !== false)
- continue;
- $filename = fileext($file);
- $file_name = basename($file);
- $filename = $this->getname($filename);
- $newfile = $uploaddir . $filename;
- $upload_func = $this->upload_func;
- if ($upload_func($file, $newfile)) {
- $oldpath[] = $k;
- $GLOBALS['downloadfiles'][] = $newpath[] = $uploadpath . $filename;
- @chmod($newfile, 0777);
- $fileext = fileext($filename);
- if ($watermark) {
- watermark($newfile, $newfile, $this->siteid);
- }
- $filepath = $dir . $filename;
- $downloadedfile = array('filename' => $filename, 'filepath' => $filepath, 'filesize' => filesize($newfile), 'fileext' => $fileext);
- $aid = $this->add($downloadedfile);
- $this->downloadedfiles[$aid] = $filepath;
- }
- }
- return str_replace($oldpath, $newpath, $value);
- }
- /**
- * 附件删除方法
- * @param $where 删除sql语句
- */
- function delete($where)
- {
- $this->att_db = pc_base::load_model('attachment_model');
- $result = $this->att_db->select($where);
- foreach ($result as $r) {
- $image = $this->upload_root . $r['filepath'];
- @unlink($image);
- $thumbs = glob(dirname($image) . '/*' . basename($image));
- if ($thumbs)
- foreach ($thumbs as $thumb)
- @unlink($thumb);
- }
- return $this->att_db->delete($where);
- }
- /**
- * 附件添加如数据库
- * @param $uploadedfile 附件信息
- */
- function add($Arrupfileinfo)
- {
- Doo::loadModel('attachment');
- $attaobj = new AttachmentModel();
- $aid = $attaobj->add_attachment($Arrupfileinfo);
- return $aid;
- }
- function set_userid($userid)
- {
- $this->userid = $userid;
- }
- /**
- * 获取缩略图地址..
- * @param $image 图片路径
- */
- function get_thumb($image)
- {
- return str_replace('.', '_thumb.', $image);
- }
- /**
- * 获取附件名称
- * @param $fileext 附件扩展名
- */
- function getname($fileext)
- {
- return date('Ymdhis') . rand(100, 999) . '.' . $fileext;
- }
- /**
- * 返回附件大小
- * @param $filesize 图片大小
- */
- function size($filesize)
- {
- if ($filesize >= 1073741824) {
- $filesize = round($filesize / 1073741824 * 100) / 100 . ' GB';
- } elseif ($filesize >= 1048576) {
- $filesize = round($filesize / 1048576 * 100) / 100 . ' MB';
- } elseif ($filesize >= 1024) {
- $filesize = round($filesize / 1024 * 100) / 100 . ' KB';
- } else {
- $filesize = $filesize . ' Bytes';
- }
- return $filesize;
- }
- /**
- * 判断文件是否是通过 HTTP POST 上传的
- *
- * @param string $file 文件地址
- * @return bool 所给出的文件是通过 HTTP POST 上传的则返回 TRUE
- */
- function isuploadedfile($file)
- {
- return is_uploaded_file($file) || is_uploaded_file(str_replace('\\\\', '\\', $file));
- }
- /**
- * 补全网址
- *
- * @param string $surl 源地址
- * @param string $absurl 相对地址
- * @param string $basehref 网址
- * @return string 网址
- */
- function fillurl($surl, $absurl, $basehref = '')
- {
- if ($basehref != '') {
- $preurl = strtolower(substr($surl, 0, 6));
- if ($preurl == 'http://' || $preurl == 'ftp://' || $preurl == 'mms://' || $preurl == 'rtsp://' || $preurl == 'thunde' || $preurl == 'emule://' || $preurl == 'ed2k://')
- return $surl;
- else
- return $basehref . '/' . $surl;
- }
- $i = 0;
- $dstr = '';
- $pstr = '';
- $okurl = '';
- $pathStep = 0;
- $surl = trim($surl);
- if ($surl == '')
- return '';
- $urls = @parse_url(SITE_URL);
- $HomeUrl = $urls['host'];
- $BaseUrlPath = $HomeUrl . $urls['path'];
- $BaseUrlPath = preg_replace("/\/([^\/]*)\.(.*)$/", '/', $BaseUrlPath);
- $BaseUrlPath = preg_replace("/\/$/", '', $BaseUrlPath);
- $pos = strpos($surl, '#');
- if ($pos > 0)
- $surl = substr($surl, 0, $pos);
- if ($surl[0] == '/') {
- $okurl = 'http://' . $HomeUrl . '/' . $surl;
- } elseif ($surl[0] == '.') {
- if (strlen($surl) <= 2)
- return '';
- elseif ($surl[0] == '/') {
- $okurl = 'http://' . $BaseUrlPath . '/' . substr($surl, 2, strlen($surl) - 2);
- } else {
- $urls = explode('/', $surl);
- foreach ($urls as $u) {
- if ($u == "..")
- $pathStep++;
- else if ($i < count($urls) - 1)
- $dstr .= $urls[$i] . '/';
- else
- $dstr .= $urls[$i];
- $i++;
- }
- $urls = explode('/', $BaseUrlPath);
- if (count($urls) <= $pathStep)
- return '';
- else {
- $pstr = 'http://';
- for ($i = 0; $i < count($urls) - $pathStep; $i++) {
- $pstr .= $urls[$i] . '/';
- }
- $okurl = $pstr . $dstr;
- }
- }
- } else {
- $preurl = strtolower(substr($surl, 0, 6));
- if (strlen($surl) < 7)
- $okurl = 'http://' . $BaseUrlPath . '/' . $surl;
- elseif ($preurl == "http:/" || $preurl == 'ftp://' || $preurl == 'mms://' || $preurl == "rtsp://" || $preurl == 'thunde' || $preurl == 'emule:' || $preurl == 'ed2k:/')
- $okurl = $surl;
- else
- $okurl = 'http://' . $BaseUrlPath . '/' . $surl;
- }
- $preurl = strtolower(substr($okurl, 0, 6));
- if ($preurl == 'ftp://' || $preurl == 'mms://' || $preurl == 'rtsp://' || $preurl == 'thunde' || $preurl == 'emule:' || $preurl == 'ed2k:/') {
- return $okurl;
- } else {
- $okurl = preg_replace('/^(http:\/\/)/i', '', $okurl);
- $okurl = preg_replace('/\/{1,}/i', '/', $okurl);
- return 'http://' . $okurl;
- }
- }
- /**
- * 是否允许上传
- */
- function is_allow_upload()
- {
- if ($_groupid == 1)
- return true;
- $starttime = SYS_TIME - 86400;
- $site_setting = $this->_get_site_setting($this->siteid);
- return ($uploads < $site_setting['upload_maxsize']);
- }
- /**
- * 返回错误信息
- */
- function error()
- {
- return $this->error;
- }
- /**
- * ck编辑器返回
- * @param $fn
- * @param $fileurl 路径
- * @param $message 显示信息
- */
- function mkhtml($fn, $fileurl, $message)
- {
- $str = '<script type="text/javascript">window.parent.CKEDITOR.tools.callFunction(' . $fn . ', \'' . $fileurl . '\', \'' . $message . '\');</script>';
- exit($str);
- }
- /**
- * flash上传调试方法
- * @param $id
- */
- function uploaderror($id = 0)
- {
- file_put_contents(PHPCMS_PATH . 'xxx.txt', $id);
- }
- /**
- * 获取站点配置信息
- * @param $siteid 站点id
- */
- private function _get_site_setting($siteid)
- {
- $siteinfo = getcache('sitelist', 'commons');
- return string2array($siteinfo[$siteid]['setting']);
- }
- /**
- * Get client's IP
- * @return string
- */
- public function clientIP()
- {
- if (getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
- return getenv('HTTP_CLIENT_IP');
- } elseif (getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
- return getenv('HTTP_X_FORWARDED_FOR');
- } elseif (getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
- return getenv('REMOTE_ADDR');
- } elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
- return $_SERVER['REMOTE_ADDR'];
- }
- }
- }
- ?>
|