国内流行的内容管理系统(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.

241 lines
10.0KB

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