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