国内流行的内容管理系统(CMS)多端全媒体解决方案 https://www.dedebiz.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

193 lines
9.8KB

  1. <?php
  2. if (!defined('DEDEINC')) exit ('dedebiz');
  3. /**
  4. * 上传处理助手
  5. *
  6. * @version $id:upload.helper.php 2010-07-05 11:43:09 tianya $
  7. * @package DedeBIZ.Helpers
  8. * @copyright Copyright (c) 2022 DedeBIZ.COM
  9. * @license https://www.dedebiz.com/license
  10. * @link https://www.dedebiz.com
  11. */
  12. /**
  13. * 管理员上传文件的通用函数
  14. *
  15. * @access public
  16. * @param string $uploadname 上传名称
  17. * @param string $ftype 文件类型
  18. * @param string $rnddd 后缀数字
  19. * @param bool $watermark 是否水印
  20. * @param string $filetype image、media、addon $file_type='' 对于swfupload上传的文件,因为没有filetype,所以需指定,并且有些特殊之处不同
  21. * @return int -1没选定上传文件,0文件类型不允许,-2保存失败
  22. */
  23. if (!function_exists('AdminUpload')) {
  24. function AdminUpload($uploadname, $ftype = 'image', $rnddd = 0, $watermark = TRUE, $filetype = '')
  25. {
  26. global $dsql, $cuserLogin, $cfg_addon_savetype, $cfg_dir_purview, $cfg_basedir, $cfg_image_dir, $cfg_soft_dir, $cfg_other_medias, $cfg_imgtype, $cfg_softtype, $cfg_mediatype;
  27. if ($watermark) include_once(DEDEINC.'/image.func.php');
  28. $file_tmp = isset($GLOBALS[$uploadname]) ? $GLOBALS[$uploadname] : '';
  29. if ($file_tmp == '' || !is_uploaded_file($file_tmp)) {
  30. return -1;
  31. }
  32. $file_tmp = $GLOBALS[$uploadname];
  33. $file_size = filesize($file_tmp);
  34. $file_type = $filetype == '' ? strtolower(trim($GLOBALS[$uploadname.'_type'])) : $filetype;
  35. $file_name = isset($GLOBALS[$uploadname.'_name']) ? $GLOBALS[$uploadname.'_name'] : '';
  36. $file_snames = explode('.', $file_name);
  37. $file_sname = strtolower(trim($file_snames[count($file_snames) - 1]));
  38. if ($ftype == 'image' || $ftype == 'imagelit') {
  39. $filetype = '1';
  40. $sparr = array('image/pjpeg', 'image/jpeg', 'image/gif', 'image/png', 'image/xpng', 'image/wbmp');
  41. if (!in_array($file_type, $sparr)) return 0;
  42. if ($file_sname == '') {
  43. if ($file_type == 'image/gif') $file_sname = 'jpg';
  44. else if ($file_type == 'image/png' || $file_type == 'image/xpng') $file_sname = 'png';
  45. else if ($file_type == 'image/wbmp') $file_sname = 'bmp';
  46. else $file_sname = 'jpg';
  47. }
  48. $filedir = $cfg_image_dir.'/'.MyDate($cfg_addon_savetype, time());
  49. } else if ($ftype == 'media') {
  50. $filetype = '3';
  51. if (!preg_match('/'.$cfg_mediatype.'/', $file_sname)) return 0;
  52. $filedir = $cfg_other_medias.'/'.MyDate($cfg_addon_savetype, time());
  53. } else {
  54. $filetype = '4';
  55. $cfg_softtype .= '|'.$cfg_mediatype.'|'.$cfg_imgtype;
  56. $cfg_softtype = str_replace('||', '|', $cfg_softtype);
  57. if (!preg_match('/'.$cfg_softtype.'/', $file_sname)) return 0;
  58. $filedir = $cfg_soft_dir.'/'.MyDate($cfg_addon_savetype, time());
  59. }
  60. if (!is_dir(DEDEROOT.$filedir)) {
  61. MkdirAll($cfg_basedir.$filedir, $cfg_dir_purview);
  62. CloseFtp();
  63. }
  64. $filename = $cuserLogin->getUserID().'-'.dd2char(MyDate('ymdHis', time())).$rnddd;
  65. if ($ftype == 'imagelit') $filename .= '-L';
  66. if (file_exists($cfg_basedir.$filedir.'/'.$filename.'.'.$file_sname)) {
  67. for ($i = 50; $i <= 5000; $i++) {
  68. if (!file_exists($cfg_basedir.$filedir.'/'.$filename.'-'.$i.'.'.$file_sname)) {
  69. $filename = $filename.'-'.$i;
  70. break;
  71. }
  72. }
  73. }
  74. $fileurl = $filedir.'/'.$filename.'.'.$file_sname;
  75. $mime = get_mime_type($file_tmp);
  76. if (!preg_match("#^image#i", $mime)) {
  77. return -1;
  78. }
  79. $rs = move_uploaded_file($file_tmp, $cfg_basedir.$fileurl);
  80. if (!$rs) return -2;
  81. if ($ftype == 'image' && $watermark) {
  82. WaterImg($cfg_basedir.$fileurl, 'up');
  83. }
  84. //保存信息到数据库
  85. $title = $filename.'.'.$file_sname;
  86. $inquery = "INSERT INTO `#@__uploads`(title,url,mediatype,width,height,playtime,filesize,uptime,mid) VALUES ('$title','$fileurl','$filetype','0','0','0','".filesize($cfg_basedir.$fileurl)."','".time()."','".$cuserLogin->getUserID()."'); ";
  87. $dsql->ExecuteNoneQuery($inquery);
  88. $fid = $dsql->GetLastID();
  89. AddMyAddon($fid, $fileurl);
  90. return $fileurl;
  91. }
  92. }
  93. //前台会员通用上传函数:$upname是文件上传框的表单名,而不是表单的变量;$handname允许会员手工指定网址情况下的网址
  94. if (!function_exists('MemberUploads')) {
  95. function MemberUploads($upname, $handname, $userid = 0, $utype = 'image', $exname = '', $maxwidth = 0, $maxheight = 0, $water = false, $isadmin = false)
  96. {
  97. global $cfg_imgtype, $cfg_mb_addontype, $cfg_mediatype, $cfg_user_dir, $cfg_basedir, $cfg_dir_purview;
  98. //当为游客投稿的情况下,这个id为0
  99. if (empty($userid)) $userid = 0;
  100. if (!is_dir($cfg_basedir.$cfg_user_dir."/$userid")) {
  101. MkdirAll($cfg_basedir.$cfg_user_dir."/$userid", $cfg_dir_purview);
  102. CloseFtp();
  103. }
  104. //有上传文件
  105. $allAllowType = str_replace('||', '|', $cfg_imgtype.'|'.$cfg_mediatype.'|'.$cfg_mb_addontype);
  106. if (!empty($GLOBALS[$upname]) && is_uploaded_file($GLOBALS[$upname])) {
  107. $nowtme = time();
  108. $GLOBALS[$upname.'_name'] = trim(preg_replace("#[ \r\n\t\*\%\\\/\?><\|\":]{1,}#", '', $GLOBALS[$upname.'_name']));
  109. //源文件类型检查
  110. if ($utype == 'image') {
  111. if (!preg_match("/\.(".$cfg_imgtype.")$/", $GLOBALS[$upname.'_name'])) {
  112. ShowMsg("您上传的图片类型错误,请上传{$cfg_imgtype}类型", "-1");
  113. exit();
  114. }
  115. $sparr = array("image/pjpeg", "image/jpeg", "image/gif", "image/png", "image/xpng", "image/wbmp");
  116. $imgfile_type = strtolower(trim($GLOBALS[$upname.'_type']));
  117. if (!in_array($imgfile_type, $sparr)) {
  118. ShowMsg("您上传的图片格式错误,请使用jpg、png、gif、wbmp格式其中一种", "-1");
  119. exit();
  120. }
  121. } else if ($utype == 'flash' && !preg_match("/\.swf$/", $GLOBALS[$upname.'_name'])) {
  122. ShowMsg("上传的文件必须为flash文件", "-1");
  123. exit();
  124. } else if ($utype == 'media' && !preg_match("/\.(".$cfg_mediatype.")$/", $GLOBALS[$upname.'_name'])) {
  125. ShowMsg("您上传的文件类型必须为:$cfg_mediatype", "-1");
  126. exit();
  127. } else if (!preg_match("/\.(".$allAllowType.")$/", $GLOBALS[$upname.'_name'])) {
  128. ShowMsg("您上传的文件类型不被允许", '-1');
  129. exit();
  130. }
  131. //再次严格检测文件扩展名是否符合系统定义的类型
  132. $fs = explode('.', $GLOBALS[$upname.'_name']);
  133. $sname = $fs[count($fs) - 1];
  134. $alltypes = explode('|', $allAllowType);
  135. if (!in_array(strtolower($sname), $alltypes)) {
  136. ShowMsg('您上传的文件类型不被允许', '-1');
  137. exit();
  138. }
  139. //强制禁止的文件类型
  140. if (preg_match("/(asp|php|pl|cgi|shtm|js)$/", $sname)) {
  141. ShowMsg("您上传的文件已被系统禁止", '-1');
  142. exit();
  143. }
  144. if ($exname == '') {
  145. $filename = $cfg_user_dir."/$userid/".dd2char($nowtme.'-'.mt_rand(1000, 9999)).'.'.$sname;
  146. } else {
  147. $filename = $cfg_user_dir."/{$userid}/{$exname}.".$sname;
  148. }
  149. $mime = get_mime_type($GLOBALS[$upname]);
  150. if (preg_match("#^unknow#", $mime)) {
  151. ShowMsg("系统不支持fileinfo组件,建议php.ini中开启", -1);
  152. exit;
  153. }
  154. if (!preg_match("#^(image|video|audio|application)#i", $mime)) {
  155. ShowMsg("仅支持媒体文件及应用程序上传", -1);
  156. exit;
  157. }
  158. move_uploaded_file($GLOBALS[$upname], $cfg_basedir.$filename) or die("上传文件到<span class='text-primary'>{$filename}</span>失败");
  159. @unlink($GLOBALS[$upname]);
  160. if (@filesize($cfg_basedir.$filename) > $GLOBALS['cfg_mb_upload_size'] * 1024) {
  161. @unlink($cfg_basedir.$filename);
  162. ShowMsg("您上传的文件超出系统大小限制", "-1");
  163. exit();
  164. }
  165. //加水印或缩小图片
  166. if ($utype == 'image') {
  167. include_once(DEDEINC.'/image.func.php');
  168. if ($maxwidth > 0 || $maxheight > 0) {
  169. ImageResize($cfg_basedir.$filename, $maxwidth, $maxheight);
  170. } else if ($water) {
  171. WaterImg($cfg_basedir.$filename);
  172. }
  173. }
  174. return $filename;
  175. }
  176. //没有上传文件
  177. else {
  178. //强制禁止的文件类型
  179. if ($handname == '') {
  180. return $handname;
  181. } else if (preg_match("/\.(asp|php|pl|cgi|shtm|js)$/", $handname)) {
  182. exit('Not allow filename for not safe!');
  183. } else if (!preg_match("/\.(".$allAllowType.")$/", $handname)) {
  184. exit('Not allow filename for filetype!');
  185. } else if (!preg_match('#^http:#', $handname) && !preg_match('#^'.$cfg_user_dir.'/'.$userid."#", $handname) && !$isadmin) {
  186. exit('Not allow filename for not userdir!');
  187. }
  188. return $handname;
  189. }
  190. }
  191. }
  192. ?>