PageRenderTime 46ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/tags/1.3/includes/files.php

http://kfm.googlecode.com/
PHP | 297 lines | 296 code | 0 blank | 1 comment | 57 complexity | c42408a508220b09446e3f5857b5d5b9 MD5 | raw file
Possible License(s): BSD-3-Clause, LGPL-2.1, Apache-2.0
  1. <?php
  2. function _copyFiles($files,$dir_id){
  3. $copied=0;
  4. $dir=kfmDirectory::getInstance($dir_id);
  5. foreach($files as $fid){
  6. $file=kfmFile::getInstance($fid);
  7. if(!$file)continue;
  8. if($dir->addFile($file))$copied++;
  9. }
  10. kfm_addMessage(kfm_lang('filesCopied',$copied));
  11. }
  12. function _createEmptyFile($cwd,$filename){
  13. global $kfm_session,$kfm_default_upload_permission;
  14. $dir=kfmDirectory::getInstance($cwd);
  15. $path=$dir->path;
  16. if(!kfmFile::checkName($filename))return kfm_error(kfm_lang('illegalFileName',$filename));
  17. $success=touch($path.$filename);
  18. if($success){
  19. chmod($path.$filename, octdec('0'.$kfm_default_upload_permission));
  20. return kfm_loadFiles($cwd);
  21. }
  22. return kfm_error(kfm_lang('couldNotCreateFile',$filename));
  23. }
  24. function _downloadFileFromUrl($url,$filename){
  25. global $kfm_session,$kfm_default_upload_permission;
  26. $cwd_id=$kfm_session->get('cwd_id');
  27. $dir=kfmDirectory::getInstance($cwd_id);
  28. $cwd=$dir->getPath();
  29. if(!kfmFile::checkName($filename))return kfm_error(kfm_lang('error: filename not allowed'));
  30. if(substr($url,0,4)!='http')return kfm_error(kfm_lang('error: url must begin with http'));
  31. $file=file_get_contents(str_replace(' ','%20',$url));
  32. if(!$file)return kfm_lang('failedDownloadFromUrl');
  33. if(!file_put_contents($cwd.'/'.$filename,$file))return kfm_lang('failedWriteToFile',$filename);
  34. chmod($cwd.'/'.$filename, octdec('0'.$kfm_default_upload_permission));
  35. return kfm_loadFiles($cwd_id);
  36. }
  37. function _extractZippedFile($id){
  38. global $kfm_session;
  39. $cwd_id=$kfm_session->get('cwd_id');
  40. if(!$GLOBALS['kfm_allow_file_create'])return kfm_error(kfm_lang('permissionDeniedCreateFile'));
  41. $file=kfmFile::getInstance($id);
  42. $dir=$file->directory.'/';
  43. { # try native system unzip command
  44. $res=-1;
  45. $arr=array();
  46. exec('unzip -l "'.$dir.$file->name.'"',$arr,$res);
  47. if(!$res){
  48. for($i=3;$i<count($arr)-2;++$i){
  49. $filename=preg_replace('/.* /','',$arr[$i]);
  50. if(!kfmFile::checkName($filename))return kfm_lang('errorZipContainsBannedFilename');
  51. }
  52. exec('unzip -o "'.$dir.$file->name.'" -x -d "'.$dir.'"',$arr,$res);
  53. }
  54. }
  55. if($res){ # try PHP unzip command
  56. return kfm_error(kfm_lang('error: unzip failed'));
  57. # TODO: fix this
  58. $zip=zip_open($dir.$file->name);
  59. while($zip_entry=zip_read($zip)){
  60. $entry=zip_entry_open($zip,$zip_entry);
  61. $filename=zip_entry_name($zip_entry);
  62. $target_dir=$dir.substr($filename,0,strrpos($filename,'/'));
  63. $filesize=zip_entry_filesize($zip_entry);
  64. if(is_dir($target_dir)||mkdir($target_dir)){
  65. if($filesize>0){
  66. $contents=zip_entry_read($zip_entry,$filesize);
  67. file_put_contents($dir.$filename,$contents);
  68. }
  69. }
  70. }
  71. }
  72. return kfm_loadFiles($cwd_id);
  73. }
  74. function _getFileAsArray($filename){
  75. return explode("\n",rtrim(file_get_contents($filename)));
  76. }
  77. function _getFileDetails($fid){
  78. $file=kfmFile::getInstance($fid);
  79. if(!is_object($file))return kfm_lang('failedGetFileObject');
  80. $fpath=$file->path;
  81. if(!file_exists($fpath))return;
  82. $details=array(
  83. 'id'=>$file->id,
  84. 'name'=>$file->name,
  85. 'filename'=>$file->name,
  86. 'mimetype'=>$file->mimetype,
  87. 'filesize'=>$file->size2str(),
  88. 'filesize_raw'=>$file->getSize(),
  89. 'tags'=>$file->getTags(),
  90. 'ctime'=>$file->ctime,
  91. 'modified'=>$file->modified,
  92. 'writable'=>$file->isWritable(),
  93. 'ext'=>$file->getExtension()
  94. );
  95. if($file->isImage()){
  96. $details['caption']=$file->caption;
  97. $details['width']=$file->width;
  98. $details['height']=$file->height;
  99. $details['thumb_url']=$file->thumb_url;
  100. }
  101. return $details;
  102. }
  103. function _getFileUrl($fid,$x=0,$y=0){
  104. $file=kfmFile::getInstance($fid);
  105. return $file->getUrl($x,$y);
  106. }
  107. function _getFileUrls($fArr){
  108. $rArr=array();
  109. foreach($fArr as $f)$rArr[]=_getFileUrl($f);
  110. return $rArr;
  111. }
  112. function _getTagName($id){
  113. global $kfmdb;
  114. $r=db_fetch_row("select name from ".KFM_DB_PREFIX."tags where id=".$id);
  115. if(count($r))return array($id,$r['name']);
  116. return array($id,kfm_lang('UNKNOWN TAG',$id));
  117. }
  118. function _getTextFile($fid){
  119. $file=kfmFile::getInstance($fid);
  120. return array('content'=>$file->getContent(),'name'=>$file->name,'id'=>$file->id);
  121. }
  122. function _loadFiles($rootid=1,$setParent=false){
  123. global $kfm_session;
  124. if(!$rootid)$rootid=1;
  125. $dir=kfmDirectory::getInstance($rootid);
  126. $oFiles=$dir->getFiles();
  127. if($dir->hasErrors())return $dir->getErrors();
  128. $files=array();
  129. foreach($oFiles as $file)$files[]=_getFileDetails($file);
  130. $root='/'.str_replace($GLOBALS['rootdir'],'',$dir->path);
  131. $kfm_session->set('cwd_id',$rootid);
  132. $ret=array('reqdir'=>$root,'files'=>$files,'uploads_allowed'=>$GLOBALS['kfm_allow_file_upload']);
  133. if($setParent)$ret['parent']=$rootid;
  134. return $ret;
  135. }
  136. function _moveFiles($files,$dir_id){
  137. global $kfmdb,$kfm_session;
  138. $cwd_id=$kfm_session->get('cwd_id');
  139. foreach($files as $fid){
  140. $file=kfmFile::getInstance($fid);
  141. if(!$file)continue;
  142. $file->move($dir_id);
  143. }
  144. return kfm_loadFiles($cwd_id);
  145. }
  146. function _renameFile($fid,$newfilename,$refreshFiles=true){
  147. global $kfm_session;
  148. $file=kfmFile::getInstance($fid);
  149. $file->rename($newfilename);
  150. if($refreshFiles)return kfm_loadFiles($kfm_session->get('cwd_id'));
  151. }
  152. function _renameFiles($files,$template){
  153. global $kfm_session;
  154. $cwd_id=$kfm_session->get('cwd_id');
  155. if(!$GLOBALS['kfm_allow_file_edit'])return kfm_error(kfm_lang('permissionDeniedEditFile'));
  156. $prefix=preg_replace('/\*.*/','',$template);
  157. $postfix=preg_replace('/.*\*/','',$template);
  158. $precision=strlen(preg_replace('/[^*]/','',$template));
  159. for($i=1;$i<count($files)+1;++$i){
  160. $num=str_pad($i,$precision,'0',STR_PAD_LEFT);
  161. $ret=_renameFile($files[$i-1],$prefix.$num.$postfix,false);
  162. if($ret)return $ret; # error detected
  163. }
  164. return kfm_loadFiles($cwd_id);
  165. }
  166. function _resize_bytes($size){
  167. $count=0;
  168. $format=array("B","KB","MB","GB","TB","PB","EB","ZB","YB");
  169. while(($size/1024)>1&&$count<8){
  170. $size=$size/1024;
  171. ++$count;
  172. }
  173. $return=number_format($size,0,'','.')." ".$format[$count];
  174. return $return;
  175. }
  176. function _rm($id){
  177. if(is_array($id)){
  178. $counter=0;
  179. foreach($id as $fid){
  180. $file=kfmFile::getInstance($fid);
  181. if($file->delete())$counter++;
  182. }
  183. if($counter>1)kfm_addMessage(kfm_lang('files deleted',$counter));
  184. }
  185. else{
  186. $file=kfmFile::getInstance($id);
  187. $file->delete();
  188. }
  189. return $id;
  190. }
  191. function _saveTextFile($fid,$text){
  192. if(!$GLOBALS['kfm_allow_file_edit'])return kfm_error(kfm_lang('permissionDeniedEditFile'));
  193. $f=kfmFile::getInstance($fid);
  194. if(!$f->checkName())return kfm_error(kfm_lang('permissionDeniedEditFile'));
  195. if($f->setContent($text))kfm_addMessage(kfm_lang('file saved'));
  196. }
  197. function _search($keywords,$tags){
  198. global $kfmdb;
  199. $files=array();
  200. $valid_files=array();
  201. if($tags){
  202. $arr=explode(',',$tags);
  203. foreach($arr as $tag){
  204. $tag=ltrim(rtrim($tag));
  205. if($tag){
  206. $r=db_fetch_row("select id from ".KFM_DB_PREFIX."tags where name='".sql_escape($tag)."'");
  207. if(count($r)){
  208. $constraints='';
  209. if(count($valid_files))$constraints=' and (file_id='.join(' or file_id=',$valid_files).')';
  210. $rs2=db_fetch_all("select file_id from ".KFM_DB_PREFIX."tagged_files where tag_id=".$r['id'].$constraints);
  211. if(count($rs2)){
  212. $valid_files=array();
  213. foreach($rs2 as $r2)$valid_files[]=$r2['file_id'];
  214. }
  215. else $valid_files=array(0);
  216. }
  217. }
  218. }
  219. }
  220. if(($tags&&count($valid_files))||$keywords){ # keywords
  221. $constraints='';
  222. if(count($valid_files))$constraints=' and (id='.join(' or id=',$valid_files).')';
  223. $fs=db_fetch_all("select id from ".KFM_DB_PREFIX."files where name like '%".sql_escape($keywords)."%'".$constraints." order by name");
  224. foreach($fs as $f){
  225. $file=kfmFile::getInstance($f['id']);
  226. if(!$file->checkName())continue;
  227. unset($file->db);
  228. $files[]=_getFileDetails($f['id']);
  229. }
  230. }
  231. return array('reqdir'=>kfm_lang('searchResults'),'files'=>$files,'uploads_allowed'=>0);
  232. }
  233. function _tagAdd($recipients,$tagList){
  234. if(!$GLOBALS['kfm_allow_file_edit'])return kfm_error(kfm_lang('permissionDeniedEditFile'));
  235. global $kfmdb;
  236. if(!is_array($recipients))$recipients=array($recipients);
  237. $arr=explode(',',$tagList);
  238. $tagList=array();
  239. foreach($arr as $v){
  240. $v=ltrim(rtrim($v));
  241. if($v)$tagList[]=$v;
  242. }
  243. if(count($tagList))foreach($tagList as $tag){
  244. $r=db_fetch_row("select id from ".KFM_DB_PREFIX."tags where name='".sql_escape($tag)."'");
  245. if(count($r)){
  246. $tag_id=$r['id'];
  247. $kfmdb->query("delete from ".KFM_DB_PREFIX."tagged_files where tag_id=".$tag_id." and (file_id=".join(' or file_id=',$recipients).")");
  248. }
  249. else{
  250. $q=$kfmdb->query("insert into ".KFM_DB_PREFIX."tags (name) values('".sql_escape($tag)."')");
  251. $tag_id=$kfmdb->lastInsertId(KFM_DB_PREFIX.'tags','id');
  252. }
  253. foreach($recipients as $file_id)$kfmdb->query("insert into ".KFM_DB_PREFIX."tagged_files (tag_id,file_id) values(".$tag_id.",".$file_id.")");
  254. }
  255. return _getFileDetails($recipients[0]);
  256. }
  257. function _tagRemove($recipients,$tagList){
  258. if(!$GLOBALS['kfm_allow_file_edit'])return kfm_error(kfm_lang('permissionDeniedEditFile'));
  259. global $kfmdb;
  260. if(!is_array($recipients))$recipients=array($recipients);
  261. $arr=explode(',',$tagList);
  262. $tagList=array();
  263. foreach($arr as $tag){
  264. $tag=ltrim(rtrim($tag));
  265. if($tag){
  266. $r=db_fetch_row("select id from ".KFM_DB_PREFIX."tags where name='".sql_escape($tag)."'");
  267. if(count($r))$tagList[]=$r['id'];
  268. }
  269. }
  270. if(count($tagList))$kfmdb->exec("delete from ".KFM_DB_PREFIX."tagged_files where (file_id=".join(' or file_id=',$recipients).") and (tag_id=".join(' or tag_id="',$tagList).")");
  271. return _getFileDetails($recipients[0]);
  272. }
  273. function _zip($filename,$files){
  274. global $kfm_session;
  275. $cwd_id=$kfm_session->get('cwd_id');
  276. $dir=kfmDirectory::getInstance($cwd_id);
  277. $cwd=$dir->path;
  278. if(!$GLOBALS['kfm_allow_file_create'])return kfm_error(kfm_lang('permissionDeniedCreateFile'));
  279. global $rootdir;
  280. if(!kfmFile::checkName($filename))return kfm_error(kfm_lang('illegalFileName',$filename));
  281. $arr=array();
  282. foreach($files as $f){
  283. $file=kfmFile::getInstance($f);
  284. if(!$file)return kfm_error(kfm_lang('missingFileInSelection'));
  285. $arr[]=$file->path;
  286. }
  287. { # try native system zip command
  288. $res=-1;
  289. $pdir=$cwd.'/';
  290. $zipfile=$pdir.$filename;
  291. for($i=0;$i<count($arr);++$i)$arr[$i]=str_replace($pdir,'',$arr[$i]);
  292. exec('cd "'.$cwd.'" && zip -D "'.$zipfile.'" "'.join('" "',$arr).'"',$arr,$res);
  293. }
  294. if($res)return kfm_error(kfm_lang('noNativeZipCommand'));
  295. return kfm_loadFiles($cwd_id);
  296. }
  297. ?>