upload.lib.php
上传用户:jiangbw
上传日期:2022-03-16
资源大小:49k
文件大小:15k
源码类别:

MySQL数据库

开发平台:

Unix_Linux

  1. <?
  2. /*======================================================================*
  3. || #################################################################### ||
  4. || # BUILD UNDER PHP SCRIPTNET 3.2.1 FRAMEWORK ||
  5. || # ---------------------------------------------------------------- # ||
  6. || # Code2Art Open Source Software. All Rights Reserved.  ||
  7. || # This file should be redistributed in whole or significant part.  # ||
  8. || # ------------------ SCRIPTNET IS FREE SOFTWARE ------------------ # ||
  9. || # http://www.code2art.com | http://www.code2art.com/scriptnet      # ||
  10. || # Copyleft by Benediktus Ardian Hersanto, SE       # ||
  11. || # Sorry if this framework is still unavailable for public       # ||
  12. || # because I still searching on my own head.       # ||
  13. || #################################################################### ||
  14. *======================================================================*/
  15. //
  16. // This library must be use under SCRIPTNET Framework or part of its constant's value cannot be
  17. // recognized, or you can force yourself to modify this class its all up to you
  18. //
  19. // Warning :
  20. //   This library and the associated files are non commercial, non professional
  21. //   work.
  22. //   It should not have unexpected results. However if any damage is caused by
  23. //   this software the author can not be responsible.
  24. //   The use of this software is at the risk of the user.
  25. //
  26. // --------------------------------------------------------------------------------
  27. // Free to use to everyone who understand PHP
  28. // --------------------------------------------------------------------------------
  29. // author  : Benediktus Ardian Hersanto, SE
  30. // email   : ardie_b@yahoo.com
  31. // 
  32. ////////////////////////////////////////////////////////////////////////////////////
  33. // NOTES on PHP.INI open_basedir restriction
  34. //
  35. // if your hosting company enabling open_basedir restriction based on your host dir
  36. //  and you still can not upload, please check or ask for apache configuration http.conf
  37. //  to be set on your virtual host directory (open_basedir) and (upload_tmp_dir) value
  38. //
  39. // <Directory "/path/of/your/virtual/host/account/">
  40. // Options Indexes FollowSymLinks MultiViews
  41. // php_admin_value open_basedir "/path/of/your/virtual/host/account/"
  42. // php_admin_value upload_tmp_dir "/path/of/your/virtual/host/account/tmp/"
  43. // AllowOverride None
  44. // Order allow,deny
  45. // Allow from all
  46. //  </Directory>
  47. // 
  48. // you have to create /tmp directory based on upload_tmp_dir value on your account root dir
  49. //  and chmod to 0777
  50. class upload {
  51.         // MIME Type Definition
  52.         var $image = array("image/gif","image/jpeg","image/pjpeg");
  53.         var $text  = array("text/plain","text/html","text/richtext","text/xml","text/css");
  54.         var $doc   = array("application/msword","application/pdf","application/rtf","application/vnd.ms-excel");
  55.         var $zip   = array("application/x-zip-compressed","application/x-compress","application/x-compressed","application/x-tar","application/x-gzip","application/x-gtar","application/mac-binhex40");
  56.         var $mpeg  = array("video/mpeg","video/quicktime","video/x-msvideo");
  57.         var $audio = array("audio/mpeg","audio/wav");
  58. var $files = array();
  59. var $file_types = array();
  60. var $count = 0;
  61. var $debug = false;
  62.         var $lowercase = false;
  63. var $LOG_ERROR = true;
  64. var $SHOW_ERROR = true;
  65. var $error_log = "/logs/upload_logs.log";
  66.         var $target_dir = "";
  67.         var $version = "File_Upload_16.01.06";
  68.         
  69.         
  70.         function upload($target_dir='',$force_create=false) {
  71.    $this->_FILES = (PHPVERSION<4.10)?$GLOBALS['HTTP_POST_FILES']:$_FILES;
  72.    $this->_ENV = (isset($_ENV))?$_ENV:$GLOBALS['HTTP_ENV_VARS'];
  73.    $this->_SERVER = (isset($_SERVER))?$_SERVER:$GLOBALS['HTTP_SERVER_VARS'];
  74.    if(count($this->_FILES)>0) {
  75.    while(list($name,$info)=each($this->_FILES)) {
  76.     if($info['error']=='0') {
  77. $this->files[] = $target_dir.$info['name'];
  78. $this->file_types[] = array_pop(explode('.',$info['name']));
  79. }
  80.    }
  81.    }
  82.            $this->count = count($this->_FILES);
  83.    if(!empty($target_dir)) $this->target_dir = $target_dir;
  84.    if($force_create) define('UPLOAD_FORCE_CREATE_DIR',true);
  85.    if(defined('AUTOSAVE')&&constant('AUTOSAVE')==true) $this->SaveFile();
  86.         }
  87.         
  88. function RaiseError($msg,$type=E_USER_WARNING) {
  89. if($this->LOG_ERROR) {
  90. $date = getdate();
  91. $REMOTE_ADDRESS = getenv('REMOTE_ADDR');
  92. error_log("[{$date['weekday']} {$date['month']} {$date['mday']} {$date['hours']}:{$date['minutes']}:{$date['seconds']} {$date['year']}] [client {$REMOTE_ADDRESS}] [Error : {$msg}]rn", 3, $this->error_log);
  93. }
  94. if($this->SHOW_ERROR) trigger_error($msg,$type);
  95. }
  96. function GetMimeType() {
  97. while(list($key,$array)=each($this->_FILES)) {
  98. if(is_array($array)&&count($array)>0) {
  99. $result[$key] = $array['type'];
  100. } else break;
  101. }
  102. if(isset($result)) return $result;
  103. else return NULL;
  104. }
  105.         function SaveFile($form_input_name="",$dir="./") {
  106. if(empty($form_input_name)) {
  107. if(!empty($this->target_dir)) $dir = $this->target_dir;
  108. else trigger_error('Target directory to save uploaded file was not defined',E_USER_WARNING);
  109. $pos = strrpos($dir, "/");
  110. if(!is_dir($dir)) {
  111. if(defined('UPLOAD_FORCE_CREATE_DIR')) {
  112. if(mkdir($dir,0777)) if($pos==false||$pos<(strlen($dir)-1)) $dir .= "/";
  113. else {
  114. if($this->debug) echo 'Error on '.__FILE__.' line '.__LINE__.'<BR>';
  115. $this->RaiseError('upload<b>::</b>SaveFile() failed to save file from stream<b>:</b> permission denied for system to copy file');
  116. return false;
  117. }
  118. } else {
  119. if($this->debug) echo 'Error on '.__FILE__.' line '.__LINE__.'<BR>';
  120. $this->RaiseError('upload<b>::</b>SaveFile() failed to save file from stream<b>:</b> destination directory was not exists'); 
  121. return false;
  122. }
  123. } else {
  124. if ($dirHwnd = opendir($dir)) closedir($dirHwnd);
  125. else {
  126. if($this->debug) echo 'Error on '.__FILE__.' line '.__LINE__.'<BR>';
  127. $this->RaiseError('upload<b>::</b>SaveFile() failed to save file from stream<b>:</b> permission denied for system to copy file');
  128. return false;
  129. }
  130. if ($pos==false||$pos==(strlen($dir)-1)) $dir .= "/";
  131. }
  132. if($this->count>0) {
  133. while(list($key,$array)=each($this->_FILES)) {
  134. if(trim($array['error'])=='0') {
  135. if(file_exists($array['tmp_name'])) {
  136. if($this->lowercase) {
  137. if(move_uploaded_file($array['tmp_name'],$dir.strtolower($this->_FILES[$key]['name']))) {
  138. if(chmod($dir.strtolower($this->_FILES[$key]['name']),0777))
  139. return true; 
  140. else {
  141. if($this->debug) echo 'Error on '.__FILE__.' line '.__LINE__.'<BR>';
  142. return false;
  143. }
  144. } else {
  145. if($this->debug) echo 'Error on '.__FILE__.' line '.__LINE__.'<BR>';
  146. return false;
  147. }
  148. } else {
  149. //$bytes = @file_put_contents($dir.$this->_FILES[$key]['name'],file_get_contents($array['tmp_name']));
  150. if(move_uploaded_file($array['tmp_name'],$dir.$this->_FILES[$key]['name'])) {
  151. if(chmod($dir.strtolower($this->_FILES[$key]['name']),0777)) 
  152. return true; 
  153. else {
  154. if($this->debug) echo 'Error on '.__FILE__.' line '.__LINE__.'<BR>';
  155. return false;
  156. }
  157. } else return false;
  158. }
  159. //if($bytes==0) copy($array['tmp_name'],$dir.$this->_FILES[$key]['name']);
  160. } else {
  161. if($this->debug) echo 'Error on '.__FILE__.' line '.__LINE__.'<BR>';
  162. $this->RaiseError('upload<b>::</b>SaveFile(''.$dir.$this->_FILES[$key]['name'].'') failed to save file from stream<b>:</b> No such valid source file', E_USER_NOTICE);
  163. return false;
  164. }
  165. } else {
  166. $this->error[$key] = $this->_getErrorDescription($array['error']);
  167. }
  168. } else echo 'here';
  169. } else {
  170. if(trim($this->_FILES[$form_input_name]['error'])!=0){ $this->RaiseError('No file was uploaded'); return; }
  171. $pos = strrpos($dir, "/");
  172. if($pos<(strlen($dir)-1)) $dir .= "/";
  173. if(!is_dir($dir)) {
  174. if($pos!=false) {
  175. $dirs = explode("/",$dir);
  176. for($i=0;$i<count($dirs);$i++) {
  177. if($dirs[$i]=='..') {
  178. $upper[] = $dirs[$i];
  179. } else {
  180. if(isset($upper)) {
  181. if(count($upper)>1) {
  182. if(!is_dir(implode("/",$upper)."/".$dirs[$i])) mkdir(implode("/",$upper)."/".$dirs[$i],0777);
  183. $upper[] = $dirs[$i];
  184. } else if(count($upper)==1) {
  185. if(!is_dir(implode("/",$upper)."/".$dirs[$i])) mkdir($upper[0]."/".$dirs[$i],0777);
  186. $upper[] = $dirs[$i];
  187. }
  188. }
  189. }
  190. }
  191. }
  192. } else {
  193. if($this->debug) echo 'Error on '.__FILE__.' line '.__LINE__.'<BR>';
  194. }
  195. if(file_exists($this->_FILES[$form_input_name]['tmp_name'])) {
  196. if($this->lowercase) {
  197. if(move_uploaded_file($this->_FILES[$form_input_name]['tmp_name'],$dir.strtolower($this->_FILES[$form_input_name]['name']))) {
  198. if(chmod($dir.strtolower($this->_FILES[$form_input_name]['name']),0777))
  199. return true; 
  200. else {
  201. if($this->debug) echo 'Error on '.__FILE__.' line '.__LINE__.'<BR>';
  202. return false;
  203. }
  204. } else return false;
  205. } else {
  206. if(move_uploaded_file($this->_FILES[$form_input_name]['tmp_name'],$dir.$this->_FILES[$form_input_name]['name'])) {
  207. if(chmod($dir.strtolower($this->_FILES[$form_input_name]['name']),0777))
  208. return true; 
  209. else {
  210. if($this->debug) echo 'Error on '.__FILE__.' line '.__LINE__.'<BR>';
  211. return false;
  212. }
  213. } else return false;
  214. }
  215. } else {
  216. if($this->debug) echo 'Error on '.__FILE__.' line '.__LINE__.'<BR>';
  217. $this->RaiseError('upload<b>::</b>SaveFile(''.$dir.$this->_FILES[$form_input_name]['name'].'') failed to save file from stream<b>:</b> No such valid source file', E_USER_NOTICE);
  218. return false;
  219. }
  220. }
  221. }
  222. /* Use alternate path for saving file
  223.    for instance : ./filename.txt => to save to current directory; 
  224.       ../dir/filename.txt => to save to directory "dir" on same level */
  225. function SaveAs($form_input_name,$filename) {
  226. if(!isset($this->_FILES[$form_input_name]['tmp_name'])){ $this->RaiseError('No file was uploaded'); return; }
  227. $pos = strrpos($filename, "/");
  228. if ($pos==false) {
  229. $pos = strrpos($this->target_dir, "/");
  230. if ($pos==false||($pos<(strlen($this->target_dir)-1))) $filename = $this->target_dir."/".$filename;
  231. else if($pos==(strlen($this->target_dir)-1)) $filename = $this->target_dir.$filename;
  232. } else {
  233. if(dirname($filename)!=$filename&&dirname($filename)!='..') {
  234. $dirs = explode("/",dirname($filename));
  235. for($i=0;$i<count($dirs);$i++) {
  236. if($dirs[$i]=='..') {
  237. $upper[] = $dirs[$i];
  238. } else {
  239. if(isset($upper)) {
  240. if(count($upper)>1) {
  241. if(!is_dir(implode("/",$upper)."/".$dirs[$i])) mkdir(implode("/",$upper)."/".$dirs[$i],0777);
  242. $upper[] = $dirs[$i];
  243. } else if(count($upper)==1) {
  244. if(!is_dir(implode("/",$upper)."/".$dirs[$i])) mkdir($upper[0]."/".$dirs[$i],0777);
  245. $upper[] = $dirs[$i];
  246. }
  247. }
  248. }
  249. }
  250. }
  251. }
  252. if(file_exists($this->_FILES[$form_input_name]['tmp_name'])) {
  253. if($this->lowercase) file_put_contents(strtolower($filename),file_get_contents($this->_FILES[$form_input_name]['tmp_name'])); else
  254. file_put_contents($filename,file_get_contents($this->_FILES[$form_input_name]['tmp_name']));
  255. } else {
  256. if($this->debug) echo 'Error on '.__FILE__.' line '.__LINE__.'<BR>';
  257. $this->RaiseError('upload<b>::</b>SaveFile(''.$dir.$this->_FILES[$form_input_name]['name'].'') failed to save file from stream<b>:</b> No such valid source file', E_USER_NOTICE);
  258. }
  259. }
  260. function _getErrorDescription($n) {
  261. switch ($n) {
  262. case 0: return 'There is no error, the file was uploaded successfully';
  263. break;
  264. case 1: return 'The uploaded file exceeds the upload_max_filesize directive in php.ini';
  265. break;
  266. case 2: return 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form';
  267. break;
  268. case 3: return 'The uploaded file was only partially uploaded';
  269. break;
  270. case 4: return 'No file was uploaded';
  271. break;
  272. }
  273. }
  274. }
  275. if (!function_exists('file_get_contents')) {
  276.     function file_get_contents($filename, $incpath = false, $resource_context = null)
  277.     {
  278.         if (false === $fh = fopen($filename, 'rb', $incpath)) {
  279.             trigger_error('file_get_contents() failed to open stream<b>:</b> No such file or directory', E_USER_WARNING);
  280.             return false;
  281.         }
  282.         clearstatcache();
  283.         if ($fsize = @filesize($filename)) {
  284.             $data = fread($fh, $fsize);
  285.         } else {
  286.             $data = '';
  287.             while (!feof($fh)) {
  288.                 $data .= fread($fh, 8192);
  289.             }
  290.         }
  291.         fclose($fh);
  292.         return $data;
  293.     }
  294. }
  295. if (!function_exists('file_put_contents')) {
  296. define('FILE_APPEND',1);
  297. define('FILE_USE_INCLUDE_PATH',2);
  298.     function file_put_contents($filename, $content, $flags = null, $resource_context = null)
  299.     {
  300.         // If $content is an array, convert it to a string
  301.         if (is_array($content)) {
  302.             $content = implode('', $content);
  303.         }
  304.         // If we don't have a string, throw an error
  305.         if (!is_scalar($content)) {
  306.             trigger_error('file_put_contents() The 2nd parameter should be either a string or an array', E_USER_WARNING);
  307.             return false;
  308.         }
  309.         // Get the length of date to write
  310.         $length = strlen($content);
  311.         // Check what mode we are using
  312.         $mode = ($flags & FILE_APPEND) ?
  313.                     $mode = 'a' :
  314.                     $mode = 'w';
  315.         // Check if we're using the include path
  316.         $use_inc_path = ($flags & FILE_USE_INCLUDE_PATH) ?
  317.                     true :
  318.                     false;
  319.         // Open the file for writing
  320.         if (($fh = @fopen($filename, $mode, $use_inc_path)) === false) {
  321.             trigger_error('file_put_contents() failed to open stream<b>:</b> Permission denied', E_USER_WARNING);
  322.             return false;
  323.         }
  324.         // Write to the file
  325.         $bytes = 0;
  326.         if (($bytes = @fwrite($fh, $content)) === false) {
  327.             $errormsg = sprintf('file_put_contents() Failed to write %d bytes to %s',
  328.                             $length,
  329.                             $filename);
  330.             trigger_error($errormsg, E_USER_WARNING);
  331.             return false;
  332.         }
  333.         // Close the handle
  334.         @fclose($fh);
  335.         // Check all the data was written
  336.         if ($bytes != $length) {
  337.             $errormsg = sprintf('file_put_contents() Only %d of %d bytes written, possibly out of free disk space.',
  338.                             $bytes,
  339.                             $length);
  340.             trigger_error($errormsg, E_USER_WARNING);
  341.             return false;
  342.         }
  343.         // Return length
  344.         return $bytes;
  345.     }
  346. }
  347. ?>