216 lines
8.1 KiB
PHP
216 lines
8.1 KiB
PHP
<?php
|
|
|
|
/** This file is part of KCFinder project
|
|
*
|
|
* @desc File helper class
|
|
* @package KCFinder
|
|
* @version 3.12
|
|
* @author Pavel Tzonkov <sunhater@sunhater.com>
|
|
* @copyright 2010-2014 KCFinder Project
|
|
* @license http://opensource.org/licenses/GPL-3.0 GPLv3
|
|
* @license http://opensource.org/licenses/LGPL-3.0 LGPLv3
|
|
* @link http://kcfinder.sunhater.com
|
|
*/
|
|
|
|
namespace kcfinder;
|
|
|
|
class file {
|
|
|
|
static $MIME = array(
|
|
'ai' => 'application/postscript',
|
|
'aif' => 'audio/x-aiff',
|
|
'aifc' => 'audio/x-aiff',
|
|
'aiff' => 'audio/x-aiff',
|
|
'avi' => 'video/x-msvideo',
|
|
'bin' => 'application/macbinary',
|
|
'bmp' => 'image/bmp',
|
|
'cpt' => 'application/mac-compactpro',
|
|
'css' => 'text/css',
|
|
'csv' => 'text/x-comma-separated-values',
|
|
'dcr' => 'application/x-director',
|
|
'dir' => 'application/x-director',
|
|
'doc' => 'application/msword',
|
|
'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
'dvi' => 'application/x-dvi',
|
|
'dxr' => 'application/x-director',
|
|
'eml' => 'message/rfc822',
|
|
'eps' => 'application/postscript',
|
|
'flv' => 'video/x-flv',
|
|
'gif' => 'image/gif',
|
|
'gtar' => 'application/x-gtar',
|
|
'gz' => 'application/x-gzip',
|
|
'hqx' => 'application/mac-binhex40',
|
|
'htm' => 'text/html',
|
|
'html' => 'text/html',
|
|
'jpe' => 'image/jpeg',
|
|
'jpeg' => 'image/jpeg',
|
|
'jpg' => 'image/jpeg',
|
|
'js' => 'application/x-javascript',
|
|
'log' => 'text/plain',
|
|
'mid' => 'audio/midi',
|
|
'midi' => 'audio/midi',
|
|
'mif' => 'application/vnd.mif',
|
|
'mov' => 'video/quicktime',
|
|
'movie' => 'video/x-sgi-movie',
|
|
'mp2' => 'audio/mpeg',
|
|
'mp3' => 'audio/mpeg',
|
|
'mp4' => 'video/mpeg',
|
|
'mpe' => 'video/mpeg',
|
|
'mpeg' => 'video/mpeg',
|
|
'mpg' => 'video/mpeg',
|
|
'mpga' => 'audio/mpeg',
|
|
'oda' => 'application/oda',
|
|
'pdf' => 'application/pdf',
|
|
'php' => 'application/x-httpd-php',
|
|
'php3' => 'application/x-httpd-php',
|
|
'php4' => 'application/x-httpd-php',
|
|
'phps' => 'application/x-httpd-php-source',
|
|
'phtml' => 'application/x-httpd-php',
|
|
'png' => 'image/png',
|
|
'ppt' => 'application/powerpoint',
|
|
'ps' => 'application/postscript',
|
|
'psd' => 'application/x-photoshop',
|
|
'qt' => 'video/quicktime',
|
|
'ra' => 'audio/x-realaudio',
|
|
'ram' => 'audio/x-pn-realaudio',
|
|
'rm' => 'audio/x-pn-realaudio',
|
|
'rpm' => 'audio/x-pn-realaudio-plugin',
|
|
'rtf' => 'text/rtf',
|
|
'rtx' => 'text/richtext',
|
|
'rv' => 'video/vnd.rn-realvideo',
|
|
'shtml' => 'text/html',
|
|
'sit' => 'application/x-stuffit',
|
|
'smi' => 'application/smil',
|
|
'smil' => 'application/smil',
|
|
'swf' => 'application/x-shockwave-flash',
|
|
'tar' => 'application/x-tar',
|
|
'tgz' => 'application/x-tar',
|
|
'text' => 'text/plain',
|
|
'tif' => 'image/tiff',
|
|
'tiff' => 'image/tiff',
|
|
'txt' => 'text/plain',
|
|
'wav' => 'audio/x-wav',
|
|
'wbxml' => 'application/wbxml',
|
|
'wmlc' => 'application/wmlc',
|
|
'word' => 'application/msword',
|
|
'xht' => 'application/xhtml+xml',
|
|
'xhtml' => 'application/xhtml+xml',
|
|
'xl' => 'application/excel',
|
|
'xls' => 'application/excel',
|
|
'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
'xml' => 'text/xml',
|
|
'xsl' => 'text/xml',
|
|
'zip' => 'application/x-zip'
|
|
);
|
|
|
|
/** Checks if the given file is really writable. The standard PHP function
|
|
* is_writable() does not work properly on Windows servers.
|
|
* @param string $filename
|
|
* @return bool */
|
|
|
|
static function isWritable($filename) {
|
|
$filename = path::normalize($filename);
|
|
if (!is_file($filename) || (false === ($fp = @fopen($filename, 'a+'))))
|
|
return false;
|
|
fclose($fp);
|
|
return true;
|
|
}
|
|
|
|
/** Get the extension from filename
|
|
* @param string $filename
|
|
* @param bool $toLower
|
|
* @return string */
|
|
|
|
static function getExtension($filename, $toLower=true) {
|
|
return preg_match('/^.*\.([^\.]*)$/s', $filename, $patt)
|
|
? ($toLower ? strtolower($patt[1]) : $patt[1]) : "";
|
|
}
|
|
|
|
/** Get MIME type of the given filename. If Fileinfo PHP extension is
|
|
* available the MIME type will be fetched by the file's content. The
|
|
* second parameter is optional and defines the magic file path. If you
|
|
* skip it, the default one will be loaded.
|
|
* If Fileinfo PHP extension is not available the MIME type will be fetched
|
|
* by filename extension regarding $MIME property. If the file extension
|
|
* does not exist there, returned type will be application/octet-stream
|
|
* @param string $filename
|
|
* @param string $magic
|
|
* @return string */
|
|
|
|
static function getMimeType($filename, $magic=null) {
|
|
if (class_exists("finfo")) {
|
|
$finfo = new \finfo(FILEINFO_MIME, $magic);
|
|
if ($finfo) {
|
|
$mime = $finfo->file($filename);
|
|
$mime = substr($mime, 0, strrpos($mime, ";"));
|
|
return $mime;
|
|
}
|
|
}
|
|
$ext = self::getExtension($filename, true);
|
|
return isset(self::$MIME[$ext]) ? self::$MIME[$ext] : "application/octet-stream";
|
|
}
|
|
|
|
/** Get inexistant filename based on the given filename. If you skip $dir
|
|
* parameter the directory will be fetched from $filename and returned
|
|
* value will be full filename path. The third parameter is optional and
|
|
* defines the template, the filename will be renamed to. Default template
|
|
* is {name}({sufix}){ext}. Examples:
|
|
*
|
|
* file::getInexistantFilename("/my/directory/myfile.txt");
|
|
* If myfile.txt does not exist - returns the same path to the file
|
|
* otherwise returns "/my/directory/myfile(1).txt"
|
|
*
|
|
* file::getInexistantFilename("myfile.txt", "/my/directory");
|
|
* returns "myfile.txt" or "myfile(1).txt" or "myfile(2).txt" etc...
|
|
*
|
|
* file::getInexistantFilename("myfile.txt", "/dir", "{name}[{sufix}]{ext}");
|
|
* returns "myfile.txt" or "myfile[1].txt" or "myfile[2].txt" etc...
|
|
*
|
|
* @param string $filename
|
|
* @param string $dir
|
|
* @param string $tpl
|
|
* @return string */
|
|
|
|
static function getInexistantFilename($filename, $dir=null, $tpl=null) {
|
|
if ($tpl === null) $tpl = "{name}({sufix}){ext}";
|
|
$fullPath = ($dir === null);
|
|
if ($fullPath)
|
|
$dir = path::normalize(dirname($filename));
|
|
else {
|
|
$fdir = dirname($filename);
|
|
$dir = strlen($fdir)
|
|
? path::normalize("$dir/$fdir")
|
|
: path::normalize($dir);
|
|
}
|
|
$filename = basename($filename);
|
|
$ext = self::getExtension($filename, false);
|
|
$name = strlen($ext) ? substr($filename, 0, -strlen($ext) - 1) : $filename;
|
|
$tpl = str_replace('{name}', $name, $tpl);
|
|
$tpl = str_replace('{ext}', (strlen($ext) ? ".$ext" : ""), $tpl);
|
|
$i = 1; $file = "$dir/$filename";
|
|
while (file_exists($file))
|
|
$file = "$dir/" . str_replace('{sufix}', $i++, $tpl);
|
|
|
|
return $fullPath
|
|
? $file
|
|
: (strlen($fdir)
|
|
? "$fdir/" . basename($file)
|
|
: basename($file));
|
|
}
|
|
|
|
/** Normalize given filename. Accented characters becomes non-accented and
|
|
* removes any other special characters. Usable for non-unicode filesystems
|
|
* @param $filename
|
|
* @return string */
|
|
|
|
static function normalizeFilename($filename) {
|
|
$string = htmlentities($filename, ENT_QUOTES, 'UTF-8');
|
|
if (strpos($string, '&') !== false)
|
|
$filename = html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|tilde|uml);~i', '$1', $string), ENT_QUOTES, 'UTF-8');
|
|
$filename = trim(preg_replace('~[^0-9a-z\.\- ]~i', "_", $filename));
|
|
return $filename;
|
|
}
|
|
|
|
}
|
|
|
|
?>
|