Просмотр исходного кода

updated FileStorage - exported base class

Piotr Labudda 9 лет назад
Родитель
Сommit
5ace2ae0ac
3 измененных файлов с 1175 добавлено и 1067 удалено
  1. 1071 0
      SE/se-lib/FileStorage.php
  2. 45 5
      SE/se-lib/Response.php
  3. 59 1062
      SE/se-lib/Route/FileStorage.php

+ 1071 - 0
SE/se-lib/FileStorage.php

@@ -0,0 +1,1071 @@
+<?php
+// @requires $_SERVER['SERVER_NAME']
+
+Lib::loadClass('Http');
+
+/*
+# FileStorage:
+- [x] create CRM_FILES - sql at the end of file
+  - [x] only meta fields, perms? - no perms in relation based on record which is connected
+- [x] add file to storage - API POST/PUT action
+  - [ ] base storage folder - from config - default /Library/Server/Web/Data/p5-pliki, chmod - add to instalator, upgrade
+	- [x] subfolders like postfix, but [0-9],[A-Z] - substr(strrev(base_convert($id, 10, 10 + 26)), 0, 1) - 36 folderów
+	- [x] file connected to user - A_RECORD_CREATE_AUTHOR
+	- [ ] ? file connected to user - A_OWNER (L_APP_USER)?
+- [ ] connect file to record - generate {tbl_name}__#REF__FILES
+  - [ ] ? add A_HAS_REF field to struct - cache to check if file is connected to any record
+	- [-] add sync state - remote file name, mtime to check if file has changed in Storage or remote record folder
+	- [-] sync - conflict - file connected with 2 objects and both changed and try to store changes to FileStorage
+	  - [ ] add version to REF table
+- [x] use streams for upload - better memory usage
+- [ ] use streams for upload progress in form - http://www.webiny.com/blog/2012/05/07/webiny-file-upload-with-html5-and-ajax-using-php-streams/
+- [x] add IP to table struct
+- [ ] WebDav - use only files from this table
+*/
+class FileStorage {
+
+	public static function isProduction() {// TODO: mv to Config
+		// return V::get('P5_ENV', '/Library/Server/Web/Data/p5-file-storage', $_SERVER);
+		// $env = getenv('P5_ENV');
+		// if (empty($env)) $env = 'production';
+		return ('production' == V::get('P5_ENV', 'production', $_SERVER));
+	}
+
+	public static function getRootStoragePath() {
+		return (self::isProduction()) ? '/Library/Server/Web/Data/p5-file-storage' : '/tmp/test-upload-file-storage';
+	}
+
+	public static function getTableName() {
+		return (self::isProduction()) ? 'CRM_FILES' : 'CRM_FILES__#DEV';
+	}
+
+	public static function getFileById($idFile) {
+		$fileObject = array();// @returns array
+		$fileObject['_raw'] = null;// raw object from database
+		$fileObject['id'] = (int)$idFile;
+		$fileObject['name'] = '';
+		$fileObject['relativePath'] = null;
+		$fileObject['absolutePath'] = null;
+		$fileObject['exists'] = null;
+		$fileObject['size'] = 0;
+		$fileObject['mimeType'] = null;
+		$rowFile = self::_getRowFile($idFile);
+		$fileObject['_raw'] = $rowFile;
+		// TODO: check perms
+		$fileObject['name'] = V::get('FILE_LABEL', $id, $rowFile);
+		$fileObject['relativePath'] = self::generateFilePathHashFromId($rowFile['ID']);
+		$fileObject['absolutePath'] = self::getRootStoragePath() . "/" . $fileObject['relativePath'];
+		$fileObject['exists'] = file_exists($fileObject['absolutePath']);
+		if ($fileObject['exists']) {
+			$fileObject['size'] = ($rowFile['FILE_SIZE']) ? $rowFile['FILE_SIZE'] : filesize($absFilePath);
+			$fileObject['mimeType'] = ($rowFile['FILE_MIME_TYPE']) ? $rowFile['FILE_MIME_TYPE'] : mime_content_type($absFilePath);
+		}
+		return $fileObject;
+	}
+
+	public static function addFileStream($inputHandler, $name = '') {
+		$sqlLogin = User::getLogin();
+		$sqlIP = Request::getUserIp();
+		$sqlLabel = DB::getPDO()->quote($name, PDO::PARAM_STR);
+		$idFile = self::_createRowFile($name);
+		DBG::_('DBG', '>1', "idFile", $idFile, __CLASS__, __FUNCTION__, __LINE__);
+		$fileObject = self::getFileById($idFile);
+		$absFilePath = $fileObject['absolutePath'];
+		$dirPath = dirname($absFilePath);
+		@mkdir($dirPath, $mode = 0775, $recursive = true);
+		if (!file_exists($dirPath)) throw new HttpException("#L" . __LINE__ . ": Cannot create path", 500);
+		@chmod($dirPath, $mode = 0775);
+
+		// create a temp file where to save data from the input stream
+		$fileHandler = fopen($absFilePath, "w+");
+		DBG::_('DBG', '>1', "absFilePath", $absFilePath, __CLASS__, __FUNCTION__, __LINE__);
+
+		// save data from the input stream
+		while (true) {
+			$buffer = fgets($inputHandler, 4096);
+			if (strlen($buffer) == 0) {
+				fclose($inputHandler);
+				fclose($fileHandler);
+				break;
+			}
+			fwrite($fileHandler, $buffer);
+		}
+
+		if (!file_exists($absFilePath)) throw new Exception("Cannot save file");
+		self::_uploadUpdateMimeType($idFile, $absFilePath);
+		self::_uploadUpdateStat($idFile, $absFilePath);
+		return $idFile;
+	}
+
+	public static function addFile($content, $name = '') {
+		$rootFileStoragePath = self::getRootStoragePath();
+		$idFile = self::_createRowFile($name);
+		DBG::_('DBG', '>1', "idFile", $idFile, __CLASS__, __FUNCTION__, __LINE__);
+		$fileObject = self::getFileById($idFile);
+		$absFilePath = $fileObject['absolutePath'];
+		$dirPath = dirname($absFilePath);
+		@mkdir($dirPath, $mode = 0777, $recursive = true);
+		if (!file_exists($dirPath)) throw new Exception("Cannot create path");
+		@chmod($dirPath, $mode = 0777);
+
+		$fp = fopen($absFilePath, 'w');
+		fwrite($fp, $fileContent);
+		fclose($fp);
+
+		if (!file_exists($absFilePath)) throw new Exception("Cannot save file");
+		self::_uploadUpdateMimeType($idFile, $absFilePath);
+		self::_uploadUpdateStat($idFile, $absFilePath);
+		return $idFile;
+	}
+
+	public static function _createRowFile($name = '') {
+		$sqlLogin = User::getLogin();
+		$sqlLabel = DB::getPDO()->quote($name, PDO::PARAM_STR);
+		$sqlIP = DB::getPDO()->quote(Request::getUserIp(), PDO::PARAM_STR);
+		$sqlTblName = self::getTableName();
+		$sql = "
+			insert into `{$sqlTblName}` (`A_RECORD_CREATE_AUTHOR`,`A_RECORD_CREATE_DATE`,`FILE_LABEL`,`A_USER_IP`)
+			values ('{$sqlLogin}', NOW(), {$sqlLabel}, INET_ATON({$sqlIP}))
+		";
+		DBG::_('DBG', '>2', "sql", $sql, __CLASS__, __FUNCTION__, __LINE__);
+		DB::getPDO()->exec($sql);
+		return DB::getPDO()->lastInsertId();
+	}
+
+	public static function _getRowFile($idFile) {
+		$idFile = intval($idFile);
+		if ($idFile <= 0) throw new HttpException("#L" . __LINE__ . ": Wrong file id", 500);
+		$sqlId = DB::getPDO()->quote($idFile, PDO::PARAM_INT);
+		$sqlTblName = self::getTableName();
+		$rows = DB::getPDO()->fetchAll("
+			select f.*
+			from `{$sqlTblName}` f
+			where f.ID = {$sqlId}
+		");
+		DBG::_('DBG', '>2', "rows", $rows, __CLASS__, __FUNCTION__, __LINE__);
+		if (empty($rows)) throw new HttpException("Plik nie istnieje w bazie", 404);
+		return $rows[0];
+	}
+
+	public static function _uploadUpdateMimeType($idFile, $absPath) {
+		$mimeType = mime_content_type($absPath);
+		$mtime = filemtime($absPath);
+		DBG::_('DBG', '>1', "mimeType", $mimeType, __CLASS__, __FUNCTION__, __LINE__);
+		if (!self::isAllowedMimeType($mimeType)) {
+			$sqlTblName = self::getTableName();
+			if ('inode/x-empty' == $mimeType) {// empty file
+				DB::getPDO()->exec("
+					update `{$sqlTblName}`
+					set `A_STATUS` = 'WARNING'
+					--		, `A_STATUS_INFO` = ''
+						, `FILE_MIME_TYPE` = '{$mimeType}'
+						, `FILE_MTIME` = '{$mtime}'
+						, `FILE_SIZE` = 0
+					where `ID` = '{$idFile}'
+				");
+				throw new AlertWarningException("Wgrano pusty plik");
+			} else {// non empty, not allowed mime type
+				$size = filesize($absPath);
+				DB::getPDO()->exec("
+					update `{$sqlTblName}`
+					set `A_STATUS` = 'DELETED'
+					--		, `A_STATUS_INFO` = ''
+						, `FILE_MIME_TYPE` = '{$mimeType}'
+						, `FILE_MTIME` = '{$mtime}'
+						, `FILE_SIZE` = '{$size}'
+					where `ID` = '{$idFile}'
+				");
+				rename($absPath, "{$absPath}-not-allowed-mime-type");
+				throw new Exception("Niedozwolony typ pliku '{$mimeType}'");
+			}
+		}
+	}
+
+	public static function _uploadUpdateStat($idFile, $absPath) {
+		$mimeType = mime_content_type($absPath);
+		$mtime = filemtime($absPath);
+		$size = filesize($absPath);
+		DBG::_('DBG', '>1', "mtime", $mtime, __CLASS__, __FUNCTION__, __LINE__);
+		DBG::_('DBG', '>1', "size", $size, __CLASS__, __FUNCTION__, __LINE__);
+		$sqlTblName = self::getTableName();
+		DB::getPDO()->exec("
+			update `{$sqlTblName}`
+			set `A_STATUS` = 'NORMAL'
+				, `FILE_MIME_TYPE` = '{$mimeType}'
+				, `FILE_MTIME` = '{$mtime}'
+				, `FILE_SIZE` = '{$size}'
+			where `ID` = '{$idFile}'
+		");
+	}
+
+	public static function generateFilePathHashFromId($intId) {
+		// $base36Id = base_convert($intId, 10, 10 + 26);// 0-9 + A-Z
+		$base36Id = base_convert($intId, 10, 10 + 6);// 0-9 + A-F
+		$base36Str = str_pad($base36Id, 10, "0", STR_PAD_LEFT);
+		$base36Str = strrev($base36Str);
+		$pathParts = array();
+		$pathParts[] = substr($base36Str, 0, 2);
+		$pathParts[] = substr($base36Str, 2, 2);
+		$pathParts[] = substr($base36Str, 4);
+		$hashPath = implode("/", $pathParts);
+		// echo "ID($intId) converted to ({$base36Id})\t to ({$base36Str})\t to path ({$hashPath})\n";
+		return $hashPath;
+	}
+
+	public static function reinstall() {
+		try {
+			DB::getPDO()->exec("
+CREATE TABLE IF NOT EXISTS `CRM_FILES` (
+	`ID` int(11) NOT NULL AUTO_INCREMENT,
+	`FILE_HASH` varchar(255) NOT NULL, -- generated from ID by hash function - only for cache
+	`FILE_LABEL` varchar(255) NOT NULL, -- original file name or system name
+	`FILE_TYPE` varchar(32) NOT NULL DEFAULT '', -- $TRG_FILE -> config/.cnf--folders...
+	`FILE_MIME_TYPE` varchar(64) NOT NULL DEFAULT '',
+	`FILE_MTIME` datetime NOT NULL,
+	`FILE_SIZE` bigint NOT NULL DEFAULT 0,
+	`FILE_VERSION` int(11) NOT NULL DEFAULT 0, -- used for update
+	`A_STATUS` enum('WAITING','NORMAL','MONITOR','OFF_HARD','OFF_SOFT','DELETED','WARNING') NOT NULL DEFAULT 'WAITING',
+	`A_RECORD_CREATE_DATE` datetime DEFAULT NULL,
+	`A_RECORD_CREATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
+	`A_RECORD_UPDATE_DATE` datetime DEFAULT NULL,
+	`A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
+	`A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT '',
+	`A_CLASSIFIED` varchar(100) NOT NULL DEFAULT '',
+	`A_USER_IP` bigint NOT NULL DEFAULT '0',
+	PRIMARY KEY (`ID`),
+	KEY `FILE_TYPE` (`FILE_MIME_TYPE`)
+) ENGINE=MyISAM  DEFAULT CHARSET=latin2;
+			");
+			DB::getPDO()->exec("
+CREATE TABLE IF NOT EXISTS `CRM_FILES__#DEV` (
+	`ID` int(11) NOT NULL AUTO_INCREMENT,
+	`FILE_HASH` varchar(255) NOT NULL, -- generated from ID by hash function - only for cache
+  `FILE_LABEL` varchar(255) NOT NULL, -- original file name or system name
+  `FILE_TYPE` varchar(32) NOT NULL DEFAULT '', -- $TRG_FILE -> config/.cnf--folders...
+	`FILE_MIME_TYPE` varchar(64) NOT NULL DEFAULT '',
+	`FILE_MTIME` datetime NOT NULL,
+	`FILE_SIZE` bigint NOT NULL DEFAULT 0,
+	`FILE_VERSION` int(11) NOT NULL DEFAULT 0, -- used for update
+	`A_STATUS` enum('WAITING','NORMAL','MONITOR','OFF_HARD','OFF_SOFT','DELETED','WARNING') NOT NULL DEFAULT 'WAITING',
+	`A_RECORD_CREATE_DATE` datetime DEFAULT NULL,
+	`A_RECORD_CREATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
+	`A_RECORD_UPDATE_DATE` datetime DEFAULT NULL,
+	`A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
+	`A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT '',
+	`A_CLASSIFIED` varchar(100) NOT NULL DEFAULT '',
+	`A_USER_IP` bigint NOT NULL DEFAULT '0',
+	PRIMARY KEY (`ID`),
+	KEY `FILE_TYPE` (`FILE_MIME_TYPE`)
+) ENGINE=MyISAM  DEFAULT CHARSET=latin2;
+			");
+
+			{// TODO: only in cli mode - require root perms
+				$devRootPath = '/tmp/test-upload-file-storage';
+				if (!file_exists($devRootPath)) {
+					@mkdir($devRootPath, $mode = 0777, $recursive = true);
+					if (!file_exists($devRootPath)) throw new Exception("Cannot create FileStorage root path for dev");
+					@chmod($devRootPath, $mode = 0777);
+					@chown($devRootPath, $user = '_www');
+				}
+
+				$productionRootPath = '/Library/Server/Web/Data/p5-file-storage';
+				if (!file_exists($productionRootPath)) {
+					@mkdir($productionRootPath, $mode = 0775, $recursive = true);
+					if (!file_exists($productionRootPath)) throw new Exception("Cannot create FileStorage root path");
+					@chmod($productionRootPath, $mode = 0775);
+					@chown($productionRootPath, $user = '_www');
+				}
+			}
+		} catch (Exception $e) {
+			UI::alert('danger', $e->getMessage());
+		}
+	}
+
+	public static function isAllowedMimeType($mimeType) {
+		// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
+		switch ($mimeType) {
+			case 'image/png': return true;
+			case 'application/atom+xml': return true;// atom
+			case 'application/atomcat+xml': return true;// atomcat
+			case 'application/atomsvc+xml': return true;// atomsvc
+			case 'application/ccxml+xml': return true;// ccxml
+			case 'application/cdmi-capability': return true;// cdmia
+			case 'application/cdmi-container': return true;// cdmic
+			case 'application/cdmi-domain': return true;// cdmid
+			case 'application/cdmi-object': return true;// cdmio
+			case 'application/cdmi-queue': return true;// cdmiq
+			case 'application/cu-seeme': return true;// cu
+			case 'application/davmount+xml': return true;// davmount
+			case 'application/docbook+xml': return true;// dbk
+			case 'application/dssc+der': return true;// dssc
+			case 'application/dssc+xml': return true;// xdssc
+			case 'application/ecmascript': return true;// ecma
+			case 'application/emma+xml': return true;// emma
+			case 'application/epub+zip': return true;// epub
+			case 'application/exi': return true;// exi
+			case 'application/font-tdpfr': return true;// pfr
+			case 'application/font-woff': return true;// woff
+			case 'application/gml+xml': return true;// gml
+			case 'application/gpx+xml': return true;// gpx
+			case 'application/gxf': return true;// gxf
+			case 'application/hyperstudio': return true;// stk
+			case 'application/inkml+xml': return true;// ink inkml
+			case 'application/ipfix': return true;// ipfix
+			case 'application/java-archive': return true;// jar
+			case 'application/java-serialized-object': return true;// ser
+			case 'application/java-vm': return true;// class
+			case 'application/javascript': return true;// js
+			case 'application/json': return true;// json
+			case 'application/jsonml+json': return true;// jsonml
+			case 'application/lost+xml': return true;// lostxml
+			case 'application/mac-binhex40': return true;// hqx
+			case 'application/mac-compactpro': return true;// cpt
+			case 'application/mads+xml': return true;// mads
+			case 'application/marc': return true;// mrc
+			case 'application/marcxml+xml': return true;// mrcx
+			case 'application/mathematica': return true;// ma nb mb
+			case 'application/mathml+xml': return true;// mathml
+			case 'application/mbox': return true;// mbox
+			case 'application/mediaservercontrol+xml': return true;// mscml
+			case 'application/metalink+xml': return true;// metalink
+			case 'application/metalink4+xml': return true;// meta4
+			case 'application/mets+xml': return true;// mets
+			case 'application/mods+xml': return true;// mods
+			case 'application/mp21': return true;// m21 mp21
+			case 'application/mp4': return true;// mp4s
+			case 'application/msword': return true;// doc dot
+			case 'application/mxf': return true;// mxf
+			case 'application/octet-stream': return true;// bin dms lrf mar so dist distz pkg bpk dump elc deploy
+			case 'application/oda': return true;// oda
+			case 'application/oebps-package+xml': return true;// opf
+			case 'application/ogg': return true;// ogx
+			case 'application/omdoc+xml': return true;// omdoc
+			case 'application/onenote': return true;// onetoc2 onetmp onetoc onepkg
+			case 'application/oxps': return true;// oxps
+			case 'application/patch-ops-error+xml': return true;// xer
+			case 'application/pdf': return true;// pdf
+			case 'application/pgp-encrypted': return true;// pgp
+			case 'application/pgp-signature': return true;// asc sig
+			case 'application/pics-rules': return true;// prf
+			case 'application/pkcs10': return true;// p10
+			case 'application/pkcs7-mime': return true;// p7m p7c
+			case 'application/pkcs7-signature': return true;// p7s
+			case 'application/pkcs8': return true;// p8
+			case 'application/pkix-attr-cert': return true;// ac
+			case 'application/pkix-cert': return true;// cer
+			case 'application/pkix-crl': return true;// crl
+			case 'application/pkix-pkipath': return true;// pkipath
+			case 'application/pkixcmp': return true;// pki
+			case 'application/pls+xml': return true;// pls
+			case 'application/postscript': return true;// ai eps ps
+			case 'application/prs.cww': return true;// cww
+			case 'application/pskc+xml': return true;// pskcxml
+			case 'application/rdf+xml': return true;// rdf
+			case 'application/reginfo+xml': return true;// rif
+			case 'application/relax-ng-compact-syntax': return true;// rnc
+			case 'application/resource-lists+xml': return true;// rl
+			case 'application/resource-lists-diff+xml': return true;// rld
+			case 'application/rls-services+xml': return true;// rs
+			case 'application/rpki-ghostbusters': return true;// gbr
+			case 'application/rpki-manifest': return true;// mft
+			case 'application/rpki-roa': return true;// roa
+			case 'application/rsd+xml': return true;// rsd
+			case 'application/rss+xml': return true;// rss
+			case 'application/rtf': return true;// rtf
+			case 'application/sbml+xml': return true;// sbml
+			case 'application/scvp-cv-request': return true;// scq
+			case 'application/scvp-cv-response': return true;// scs
+			case 'application/scvp-vp-request': return true;// spq
+			case 'application/scvp-vp-response': return true;// spp
+			case 'application/sdp': return true;// sdp
+			case 'application/set-payment-initiation': return true;// setpay
+			case 'application/set-registration-initiation': return true;// setreg
+			case 'application/shf+xml': return true;// shf
+			case 'application/smil+xml': return true;// smi smil
+			case 'application/sparql-query': return true;// rq
+			case 'application/sparql-results+xml': return true;// srx
+			case 'application/srgs': return true;// gram
+			case 'application/srgs+xml': return true;// grxml
+			case 'application/sru+xml': return true;// sru
+			case 'application/ssdl+xml': return true;// ssdl
+			case 'application/ssml+xml': return true;// ssml
+			case 'application/tei+xml': return true;// tei teicorpus
+			case 'application/thraud+xml': return true;// tfi
+			case 'application/timestamped-data': return true;// tsd
+			case 'application/vnd.3gpp.pic-bw-large': return true;// plb
+			case 'application/vnd.3gpp.pic-bw-small': return true;// psb
+			case 'application/vnd.3gpp.pic-bw-var': return true;// pvb
+			case 'application/vnd.3gpp2.tcap': return true;// tcap
+			case 'application/vnd.3m.post-it-notes': return true;// pwn
+			case 'application/vnd.accpac.simply.aso': return true;// aso
+			case 'application/vnd.accpac.simply.imp': return true;// imp
+			case 'application/vnd.acucobol': return true;// acu
+			case 'application/vnd.acucorp': return true;// atc acutc
+			case 'application/vnd.adobe.air-application-installer-package+zip': return true;// air
+			case 'application/vnd.adobe.formscentral.fcdt': return true;// fcdt
+			case 'application/vnd.adobe.fxp': return true;// fxp fxpl
+			case 'application/vnd.adobe.xdp+xml': return true;// xdp
+			case 'application/vnd.adobe.xfdf': return true;// xfdf
+			case 'application/vnd.ahead.space': return true;// ahead
+			case 'application/vnd.airzip.filesecure.azf': return true;// azf
+			case 'application/vnd.airzip.filesecure.azs': return true;// azs
+			case 'application/vnd.amazon.ebook': return true;// azw
+			case 'application/vnd.americandynamics.acc': return true;// acc
+			case 'application/vnd.amiga.ami': return true;// ami
+			case 'application/vnd.android.package-archive': return true;// apk
+			case 'application/vnd.anser-web-certificate-issue-initiation': return true;// cii
+			case 'application/vnd.anser-web-funds-transfer-initiation': return true;// fti
+			case 'application/vnd.antix.game-component': return true;// atx
+			case 'application/vnd.apple.installer+xml': return true;// mpkg
+			case 'application/vnd.apple.mpegurl': return true;// m3u8
+			case 'application/vnd.aristanetworks.swi': return true;// swi
+			case 'application/vnd.astraea-software.iota': return true;// iota
+			case 'application/vnd.audiograph': return true;// aep
+			case 'application/vnd.blueice.multipass': return true;// mpm
+			case 'application/vnd.bmi': return true;// bmi
+			case 'application/vnd.businessobjects': return true;// rep
+			case 'application/vnd.chemdraw+xml': return true;// cdxml
+			case 'application/vnd.chipnuts.karaoke-mmd': return true;// mmd
+			case 'application/vnd.cinderella': return true;// cdy
+			case 'application/vnd.claymore': return true;// cla
+			case 'application/vnd.cloanto.rp9': return true;// rp9
+			case 'application/vnd.clonk.c4group': return true;// c4g c4d c4f c4p c4u
+			case 'application/vnd.cluetrust.cartomobile-config': return true;// c11amc
+			case 'application/vnd.cluetrust.cartomobile-config-pkg': return true;// c11amz
+			case 'application/vnd.commonspace': return true;// csp
+			case 'application/vnd.contact.cmsg': return true;// cdbcmsg
+			case 'application/vnd.cosmocaller': return true;// cmc
+			case 'application/vnd.crick.clicker': return true;// clkx
+			case 'application/vnd.crick.clicker.keyboard': return true;// clkk
+			case 'application/vnd.crick.clicker.palette': return true;// clkp
+			case 'application/vnd.crick.clicker.template': return true;// clkt
+			case 'application/vnd.crick.clicker.wordbank': return true;// clkw
+			case 'application/vnd.criticaltools.wbs+xml': return true;// wbs
+			case 'application/vnd.ctc-posml': return true;// pml
+			case 'application/vnd.cups-ppd': return true;// ppd
+			case 'application/vnd.curl.car': return true;// car
+			case 'application/vnd.curl.pcurl': return true;// pcurl
+			case 'application/vnd.dart': return true;// dart
+			case 'application/vnd.data-vision.rdz': return true;// rdz
+			case 'application/vnd.dece.data': return true;// uvf uvvf uvd uvvd
+			case 'application/vnd.dece.ttml+xml': return true;// uvt uvvt
+			case 'application/vnd.dece.unspecified': return true;// uvx uvvx
+			case 'application/vnd.dece.zip': return true;// uvz uvvz
+			case 'application/vnd.denovo.fcselayout-link': return true;// fe_launch
+			case 'application/vnd.dna': return true;// dna
+			case 'application/vnd.dolby.mlp': return true;// mlp
+			case 'application/vnd.dpgraph': return true;// dpg
+			case 'application/vnd.dreamfactory': return true;// dfac
+			case 'application/vnd.ds-keypoint': return true;// kpxx
+			case 'application/vnd.dvb.ait': return true;// ait
+			case 'application/vnd.dvb.service': return true;// svc
+			case 'application/vnd.dynageo': return true;// geo
+			case 'application/vnd.ecowin.chart': return true;// mag
+			case 'application/vnd.enliven': return true;// nml
+			case 'application/vnd.epson.esf': return true;// esf
+			case 'application/vnd.epson.msf': return true;// msf
+			case 'application/vnd.epson.quickanime': return true;// qam
+			case 'application/vnd.epson.salt': return true;// slt
+			case 'application/vnd.epson.ssf': return true;// ssf
+			case 'application/vnd.eszigno3+xml			es3': return true;// et3
+			case 'application/vnd.ezpix-album': return true;// ez2
+			case 'application/vnd.ezpix-package': return true;// ez3
+			case 'application/vnd.fdf': return true;// fdf
+			case 'application/vnd.fdsn.mseed': return true;// mseed
+			case 'application/vnd.fdsn.seed': return true;// seed dataless
+			case 'application/vnd.flographit': return true;// gph
+			case 'application/vnd.fluxtime.clip': return true;// ftc
+			case 'application/vnd.framemaker': return true;// fm frame maker book
+			case 'application/vnd.frogans.fnc': return true;// fnc
+			case 'application/vnd.frogans.ltf': return true;// ltf
+			case 'application/vnd.fsc.weblaunch': return true;// fsc
+			case 'application/vnd.fujitsu.oasys': return true;// oas
+			case 'application/vnd.fujitsu.oasys2': return true;// oa2
+			case 'application/vnd.fujitsu.oasys3': return true;// oa3
+			case 'application/vnd.fujitsu.oasysgp': return true;// fg5
+			case 'application/vnd.fujitsu.oasysprs': return true;// bh2
+			case 'application/vnd.fujixerox.ddd': return true;// ddd
+			case 'application/vnd.fujixerox.docuworks': return true;// xdw
+			case 'application/vnd.fujixerox.docuworks.binder': return true;// xbd
+			case 'application/vnd.fuzzysheet': return true;// fzs
+			case 'application/vnd.genomatix.tuxedo': return true;// txd
+			case 'application/vnd.geogebra.file': return true;// ggb
+			case 'application/vnd.geogebra.tool': return true;// ggt
+			case 'application/vnd.geometry-explorer': return true;// gex gre
+			case 'application/vnd.geonext': return true;// gxt
+			case 'application/vnd.geoplan': return true;// g2w
+			case 'application/vnd.geospace': return true;// g3w
+			case 'application/vnd.gmx': return true;// gmx
+			case 'application/vnd.google-earth.kml+xml': return true;// kml
+			case 'application/vnd.google-earth.kmz': return true;// kmz
+			case 'application/vnd.grafeq': return true;// gqf gqs
+			case 'application/vnd.groove-account': return true;// gac
+			case 'application/vnd.groove-help': return true;// ghf
+			case 'application/vnd.groove-identity-message': return true;// gim
+			case 'application/vnd.groove-injector': return true;// grv
+			case 'application/vnd.groove-tool-message': return true;// gtm
+			case 'application/vnd.groove-tool-template': return true;// tpl
+			case 'application/vnd.groove-vcard': return true;// vcg
+			case 'application/vnd.hal+xml': return true;// hal
+			case 'application/vnd.handheld-entertainment+xml': return true;// zmm
+			case 'application/vnd.hbci': return true;// hbci
+			case 'application/vnd.hhe.lesson-player': return true;// les
+			case 'application/vnd.hp-hpgl': return true;// hpgl
+			case 'application/vnd.hp-hpid': return true;// hpid
+			case 'application/vnd.hp-hps': return true;// hps
+			case 'application/vnd.hp-jlyt': return true;// jlt
+			case 'application/vnd.hp-pcl': return true;// pcl
+			case 'application/vnd.hp-pclxl': return true;// pclxl
+			case 'application/vnd.hydrostatix.sof-data': return true;// sfd- hdstx
+			case 'application/vnd.ibm.minipay': return true;// mpy
+			case 'application/vnd.ibm.modcap': return true;// afp listafp list3820
+			case 'application/vnd.ibm.rights-management': return true;// irm
+			case 'application/vnd.ibm.secure-container': return true;// sc
+			case 'application/vnd.iccprofile': return true;// icc icm
+			case 'application/vnd.igloader': return true;// igl
+			case 'application/vnd.immervision-ivp': return true;// ivp
+			case 'application/vnd.immervision-ivu': return true;// ivu
+			case 'application/vnd.insors.igm': return true;// igm
+			case 'application/vnd.intercon.formnet': return true;// xpw xpx
+			case 'application/vnd.intergeo': return true;// i2g
+			case 'application/vnd.intu.qbo': return true;// qbo
+			case 'application/vnd.intu.qfx': return true;// qfx
+			case 'application/vnd.ipunplugged.rcprofile': return true;// rcprofile
+			case 'application/vnd.irepository.package+xml': return true;// irp
+			case 'application/vnd.is-xpr': return true;// xpr
+			case 'application/vnd.isac.fcs': return true;// fcs
+			case 'application/vnd.jam': return true;// jam
+			case 'application/vnd.jcp.javame.midlet-rms': return true;// rms
+			case 'application/vnd.jisp': return true;// jisp
+			case 'application/vnd.joost.joda-archive': return true;// joda
+			case 'application/vnd.kahootz': return true;// ktz ktr
+			case 'application/vnd.kde.karbon': return true;// karbon
+			case 'application/vnd.kde.kchart': return true;// chrt
+			case 'application/vnd.kde.kformula': return true;// kfo
+			case 'application/vnd.kde.kivio': return true;// flw
+			case 'application/vnd.kde.kontour': return true;// kon
+			case 'application/vnd.kde.kpresenter': return true;// kpr kpt
+			case 'application/vnd.kde.kspread': return true;// ksp
+			case 'application/vnd.kde.kword': return true;// kwd kwt
+			case 'application/vnd.kenameaapp': return true;// htke
+			case 'application/vnd.kidspiration': return true;// kia
+			case 'application/vnd.kinar': return true;// kne knp
+			case 'application/vnd.koan': return true;// skp skd skt skm
+			case 'application/vnd.kodak-descriptor': return true;// sse
+			case 'application/vnd.las.las+xml': return true;// lasxml
+			case 'application/vnd.llamagraphics.life-balance.desktop': return true;// lbd
+			case 'application/vnd.llamagraphics.life-balance.exchange+xml': return true;// lbe
+			case 'application/vnd.lotus-1-2-3': return true;// 123
+			case 'application/vnd.lotus-approach': return true;// apr
+			case 'application/vnd.lotus-freelance': return true;// pre
+			case 'application/vnd.lotus-notes': return true;// nsf
+			case 'application/vnd.lotus-organizer': return true;// org
+			case 'application/vnd.lotus-screencam': return true;// scm
+			case 'application/vnd.lotus-wordpro': return true;// lwp
+			case 'application/vnd.macports.portpkg': return true;// portpkg
+			case 'application/vnd.mcd': return true;// mcd
+			case 'application/vnd.medcalcdata': return true;// mc1
+			case 'application/vnd.mediastation.cdkey': return true;// cdkey
+			case 'application/vnd.mfer': return true;// mwf
+			case 'application/vnd.mfmp': return true;// mfm
+			case 'application/vnd.micrografx.flo': return true;// flo
+			case 'application/vnd.micrografx.igx': return true;// igx
+			case 'application/vnd.mif': return true;// mif
+			case 'application/vnd.mobius.daf': return true;// daf
+			case 'application/vnd.mobius.dis': return true;// dis
+			case 'application/vnd.mobius.mbk': return true;// mbk
+			case 'application/vnd.mobius.mqy': return true;// mqy
+			case 'application/vnd.mobius.msl': return true;// msl
+			case 'application/vnd.mobius.plc': return true;// plc
+			case 'application/vnd.mobius.txf': return true;// txf
+			case 'application/vnd.mophun.application': return true;// mpn
+			case 'application/vnd.mophun.certificate': return true;// mpc
+			case 'application/vnd.mozilla.xul+xml': return true;// xul
+			case 'application/vnd.ms-artgalry': return true;// cil
+			case 'application/vnd.ms-cab-compressed': return true;// cab
+			case 'application/vnd.ms-excel': return true;// xls xlm xla xlc xlt xlw
+			case 'application/vnd.ms-excel.addin.macroenabled.12': return true;// xlam
+			case 'application/vnd.ms-excel.sheet.binary.macroenabled.12': return true;// xlsb
+			case 'application/vnd.ms-excel.sheet.macroenabled.12': return true;// xlsm
+			case 'application/vnd.ms-excel.template.macroenabled.12': return true;// xltm
+			case 'application/vnd.ms-fontobject': return true;// eot
+			case 'application/vnd.ms-htmlhelp': return true;// chm
+			case 'application/vnd.ms-ims': return true;// ims
+			case 'application/vnd.ms-lrm': return true;// lrm
+			case 'application/vnd.ms-office': return true;// theme thmx
+			case 'application/vnd.ms-pki.seccat': return true;// cat
+			case 'application/vnd.ms-pki.stl': return true;// stl
+			case 'application/vnd.ms-powerpoint': return true;// ppt pps pot
+			case 'application/vnd.ms-powerpoint.addin.macroenabled.12': return true;// ppam
+			case 'application/vnd.ms-powerpoint.presentation.macroenabled.12': return true;// pptm
+			case 'application/vnd.ms-powerpoint.slide.macroenabled.12': return true;// sldm
+			case 'application/vnd.ms-powerpoint.slideshow.macroenabled.12': return true;// ppsm
+			case 'application/vnd.ms-powerpoint.template.macroenabled.12': return true;// potm
+			case 'application/vnd.ms-project': return true;// mpp mpt
+			case 'application/vnd.ms-word.document.macroenabled.12': return true;// docm
+			case 'application/vnd.ms-word.template.macroenabled.12': return true;// dotm
+			case 'application/vnd.ms-works': return true;// wps wks wcm wdb
+			case 'application/vnd.ms-wpl': return true;// wpl
+			case 'application/vnd.ms-xpsdocument': return true;// xps
+			case 'application/vnd.mseq': return true;// mseq
+			case 'application/vnd.musician': return true;// mus
+			case 'application/vnd.muvee.style': return true;// msty
+			case 'application/vnd.mynfc': return true;// taglet
+			case 'application/vnd.neurolanguage.nlu': return true;// nlu
+			case 'application/vnd.nitf': return true;// ntf nitf
+			case 'application/vnd.noblenet-directory': return true;// nnd
+			case 'application/vnd.noblenet-sealer': return true;// nns
+			case 'application/vnd.noblenet-web': return true;// nnw
+			case 'application/vnd.nokia.n-gage.data': return true;// ngdat
+			case 'application/vnd.nokia.n-gage.symbian.install': return true;// n- gage
+			case 'application/vnd.nokia.radio-preset': return true;// rpst
+			case 'application/vnd.nokia.radio-presets': return true;// rpss
+			case 'application/vnd.novadigm.edm': return true;// edm
+			case 'application/vnd.novadigm.edx': return true;// edx
+			case 'application/vnd.novadigm.ext': return true;// ext
+			case 'application/vnd.oasis.opendocument.chart': return true;// odc
+			case 'application/vnd.oasis.opendocument.chart-template': return true;// otc
+			case 'application/vnd.oasis.opendocument.database': return true;// odb
+			case 'application/vnd.oasis.opendocument.formula': return true;// odf
+			case 'application/vnd.oasis.opendocument.formula-template': return true;// odft
+			case 'application/vnd.oasis.opendocument.graphics': return true;// odg
+			case 'application/vnd.oasis.opendocument.graphics-template': return true;// otg
+			case 'application/vnd.oasis.opendocument.image': return true;// odi
+			case 'application/vnd.oasis.opendocument.image-template': return true;// oti
+			case 'application/vnd.oasis.opendocument.presentation': return true;// odp
+			case 'application/vnd.oasis.opendocument.presentation-template': return true;// otp
+			case 'application/vnd.oasis.opendocument.spreadsheet': return true;// ods
+			case 'application/vnd.oasis.opendocument.spreadsheet-template': return true;// ots
+			case 'application/vnd.oasis.opendocument.text': return true;// odt
+			case 'application/vnd.oasis.opendocument.text-master': return true;// odm
+			case 'application/vnd.oasis.opendocument.text-template': return true;// ott
+			case 'application/vnd.oasis.opendocument.text-web': return true;// oth
+			case 'application/vnd.olpc-sugar': return true;// xo
+			case 'application/vnd.oma.dd2+xml': return true;// dd2
+			case 'application/vnd.openofficeorg.extension': return true;// oxt
+			case 'application/vnd.openxmlformats-officedocument.presentationml.presentation': return true;// pptx
+			case 'application/vnd.openxmlformats-officedocument.presentationml.slide': return true;// sldx
+			case 'application/vnd.openxmlformats-officedocument.presentationml.slideshow': return true;// ppsx
+			case 'application/vnd.openxmlformats-officedocument.presentationml.template': return true;// potx
+			case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': return true;// xlsx
+			case 'application/vnd.openxmlformats-officedocument.spreadsheetml.template': return true;// xltx
+			case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': return true;// docx
+			case 'application/vnd.openxmlformats-officedocument.wordprocessingml.template': return true;// dotx
+			case 'application/vnd.osgeo.mapguide.package': return true;// mgp
+			case 'application/vnd.osgi.dp': return true;// dp
+			case 'application/vnd.osgi.subsystem': return true;// esa
+			case 'application/vnd.palm': return true;// pdb pqa oprc
+			case 'application/vnd.pawaafile': return true;// paw
+			case 'application/vnd.pg.format': return true;// str
+			case 'application/vnd.pg.osasli': return true;// ei6
+			case 'application/vnd.picsel': return true;// efif
+			case 'application/vnd.pmi.widget': return true;// wg
+			case 'application/vnd.pocketlearn': return true;// plf
+			case 'application/vnd.powerbuilder6': return true;// pbd
+			case 'application/vnd.previewsystems.box': return true;// box
+			case 'application/vnd.proteus.magazine': return true;// mgz
+			case 'application/vnd.publishare-delta-tree': return true;// qps
+			case 'application/vnd.pvi.ptid1': return true;// ptid
+			case 'application/vnd.quark.quarkxpress': return true;// qxd qxt qwd qwt qxl qxb
+			case 'application/vnd.realvnc.bed': return true;// bed
+			case 'application/vnd.recordare.musicxml': return true;// mxl
+			case 'application/vnd.recordare.musicxml+xml': return true;// musicxml
+			case 'application/vnd.rig.cryptonote': return true;// cryptonote
+			case 'application/vnd.rim.cod': return true;// cod
+			case 'application/vnd.rn-realmedia': return true;// rm
+			case 'application/vnd.rn-realmedia-vbr': return true;// rmvb
+			case 'application/vnd.route66.link66+xml': return true;// link66
+			case 'application/vnd.sailingtracker.track': return true;// st
+			case 'application/vnd.seemail': return true;// see
+			case 'application/vnd.sema': return true;// sema
+			case 'application/vnd.semd': return true;// semd
+			case 'application/vnd.semf': return true;// semf
+			case 'application/vnd.shana.informed.formdata': return true;// ifm
+			case 'application/vnd.shana.informed.formtemplate': return true;// itp
+			case 'application/vnd.shana.informed.interchange': return true;// iif
+			case 'application/vnd.shana.informed.package': return true;// ipk
+			case 'application/vnd.simtech-mindmapper': return true;// twd twds
+			case 'application/vnd.smaf': return true;// mmf
+			case 'application/vnd.smart.teacher': return true;// teacher
+			case 'application/vnd.solent.sdkm+xml': return true;// sdkm sdkd
+			case 'application/vnd.spotfire.dxp': return true;// dxp
+			case 'application/vnd.spotfire.sfs': return true;// sfs
+			case 'application/vnd.stardivision.calc': return true;// sdc
+			case 'application/vnd.stardivision.draw': return true;// sda
+			case 'application/vnd.stardivision.impress': return true;// sdd
+			case 'application/vnd.stardivision.math': return true;// smf
+			case 'application/vnd.stardivision.writer': return true;// sdw vor
+			case 'application/vnd.stardivision.writer-global': return true;// sgl
+			case 'application/vnd.stepmania.package': return true;// smzip
+			case 'application/vnd.stepmania.stepchart': return true;// sm
+			case 'application/vnd.sun.xml.calc': return true;// sxc
+			case 'application/vnd.sun.xml.calc.template': return true;// stc
+			case 'application/vnd.sun.xml.draw': return true;// sxd
+			case 'application/vnd.sun.xml.draw.template': return true;// std
+			case 'application/vnd.sun.xml.impress': return true;// sxi
+			case 'application/vnd.sun.xml.impress.template': return true;// sti
+			case 'application/vnd.sun.xml.math': return true;// sxm
+			case 'application/vnd.sun.xml.writer': return true;// sxw
+			case 'application/vnd.sun.xml.writer.global': return true;// sxg
+			case 'application/vnd.sun.xml.writer.template': return true;// stw
+			case 'application/vnd.sus-calendar': return true;// sus susp
+			case 'application/vnd.svd': return true;// svd
+			case 'application/vnd.symbian.install			sis': return true;// sisx
+			case 'application/vnd.syncml+xml': return true;// xsm
+			case 'application/vnd.syncml.dm+wbxml': return true;// bdm
+			case 'application/vnd.syncml.dm+xml': return true;// xdm
+			case 'application/vnd.tao.intent-module-archive': return true;// tao
+			case 'application/vnd.tcpdump.pcap': return true;// pcap cap dmp
+			case 'application/vnd.tmobile-livetv': return true;// tmo
+			case 'application/vnd.trid.tpt': return true;// tpt
+			case 'application/vnd.triscape.mxs': return true;// mxs
+			case 'application/vnd.trueapp': return true;// tra
+			case 'application/vnd.ufdl': return true;// ufd ufdl
+			case 'application/vnd.uiq.theme': return true;// utz
+			case 'application/vnd.umajin': return true;// umj
+			case 'application/vnd.unity': return true;// unityweb
+			case 'application/vnd.uoml+xml': return true;// uoml
+			case 'application/vnd.vcx': return true;// vcx
+			case 'application/vnd.visio': return true;// vsd vst vss vsw
+			case 'application/vnd.visionary': return true;// vis
+			case 'application/vnd.vsf': return true;// vsf
+			case 'application/vnd.wap.wbxml': return true;// wbxml
+			case 'application/vnd.wap.wmlc': return true;// wmlc
+			case 'application/vnd.wap.wmlscriptc': return true;// wmlsc
+			case 'application/vnd.webturbo': return true;// wtb
+			case 'application/vnd.wolfram.player': return true;// nbp
+			case 'application/vnd.wordperfect': return true;// wpd
+			case 'application/vnd.wqd': return true;// wqd
+			case 'application/vnd.wt.stf': return true;// stf
+			case 'application/vnd.xara': return true;// xar
+			case 'application/vnd.xfdl': return true;// xfdl
+			case 'application/vnd.yamaha.hv-dic': return true;// hvd
+			case 'application/vnd.yamaha.hv-script': return true;// hvs
+			case 'application/vnd.yamaha.hv-voice': return true;// hvp
+			case 'application/vnd.yamaha.openscoreformat': return true;// osf
+			case 'application/vnd.yamaha.openscoreformat.osfpvg+xml': return true;// osfpvg
+			case 'application/vnd.yamaha.smaf-audio': return true;// saf
+			case 'application/vnd.yamaha.smaf-phrase': return true;// spf
+			case 'application/vnd.yellowriver-custom-menu': return true;// cmp
+			case 'application/vnd.zul': return true;// zir zirz
+			case 'application/vnd.zzazz.deck+xml': return true;// zaz
+			case 'application/voicexml+xml': return true;// vxml
+			case 'application/widget': return true;// wgt
+			case 'application/winhlp': return true;// hlp
+			case 'application/wsdl+xml': return true;// wsdl
+			case 'application/wspolicy+xml': return true;// wspolicy
+			case 'application/x-7z-compressed': return true;// 7z
+			case 'application/x-abiword': return true;// abw
+			case 'application/x-ace-compressed': return true;// ace
+			case 'application/x-apple-diskimage': return true;// dmg
+			case 'application/x-authorware-bin': return true;// aab x32 u32 vox
+			case 'application/x-authorware-map': return true;// aam
+			case 'application/x-authorware-seg': return true;// aas
+			case 'application/x-archive': return true;// ADMIN_USERS//5027.Pawel_Kamola/projekty/grafy_projekt_python/grafy/numpy/core/lib/libnpymath.a
+			case 'application/x-empty': return false;// empty files
+			case 'application/x-bcpio': return true;// bcpio
+			case 'application/x-bittorrent': return true;// torrent
+			case 'application/x-blorb': return true;// blb blorb
+			case 'application/x-bzip': return true;// bz
+			case 'application/x-bzip2': return true;// bz2 boz
+			case 'application/x-cbr': return true;// cbr cba cbt cbz cb7
+			case 'application/x-cdlink': return true;// vcd
+			case 'application/x-cfs-compressed': return true;// cfs
+			case 'application/x-chat': return true;// chat
+			case 'application/x-chess-pgn': return true;// pgn
+			case 'application/x-conference': return true;// nsc
+			case 'application/x-cpio': return true;// cpio
+			case 'application/x-csh': return true;// csh
+			case 'application/x-debian-package': return true;// deb udeb
+			case 'application/x-dgc-compressed': return true;// dgc
+			case 'application/x-director': return true;// dir dcr dxr cst cct cxt w3d fgd swa
+			case 'application/x-doom': return true;// wad
+			case 'application/x-dtbncx+xml': return true;// ncx
+			case 'application/x-dtbook+xml': return true;// dtb
+			case 'application/x-dtbresource+xml': return true;// res
+			case 'application/x-dvi': return true;// dvi
+			case 'application/x-envoy': return true;// evy
+			case 'application/x-eva': return true;// eva
+			case 'application/x-font-bdf': return true;// bdf
+			case 'application/x-font-ghostscript': return true;// gsf
+			case 'application/x-font-linux-psf': return true;// psf
+			case 'application/x-font-otf': return true;// otf
+			case 'application/x-font-pcf': return true;// pcf
+			case 'application/x-font-snf': return true;// snf
+			case 'application/x-font-ttf': return true;// ttc ttf
+			case 'application/x-font-type1': return true;// afm pfa pfb pfm
+			case 'application/x-freearc': return true;// arc
+			case 'application/x-futuresplash': return true;// spl
+			case 'application/x-executable': return true;//
+			case 'application/x-gca-compressed': return true;// gca
+			case 'application/x-glulx': return true;// ulx
+			case 'application/x-gnumeric': return true;// gnumeric
+			case 'application/x-gramps-xml': return true;// gramps
+			case 'application/x-gtar': return true;// gtar
+			case 'application/x-gzip': return true;// gz gzip
+			case 'application/x-hdf': return true;// hdf
+			case 'application/x-install-instructions': return true;// install
+			case 'application/x-iso9660-image': return true;// iso
+			case 'application/x-java-jnlp-file': return true;// jnlp
+			case 'application/x-latex': return true;// latex
+			case 'application/x-lzh-compressed': return true;// lha lzh
+			case 'application/x-mie': return true;// mie
+			case 'application/x-mobipocket-ebook': return true;// mobi prc
+			case 'application/x-ms-application': return true;// application
+			case 'application/x-ms-shortcut': return true;// lnk
+			case 'application/x-ms-wmd': return true;// wmd
+			case 'application/x-ms-wmz': return true;// wmz
+			case 'application/x-ms-xbap': return true;// xbap
+			case 'application/x-msaccess': return true;// mdb
+			case 'application/x-msbinder': return true;// obd
+			case 'application/x-mscardfile': return true;// crd
+			case 'application/x-msclip': return true;// clp
+			case 'application/x-msdownload': return true;// msi exe dll com bat
+			case 'application/x-msmediaview': return true;// m14 mvb m13
+			case 'application/x-msmetafile': return true;// emz wmf wmz emf
+			case 'application/x-msmoney': return true;// mny
+			case 'application/x-mspublisher': return true;// pub
+			case 'application/x-msschedule': return true;// scd
+			case 'application/x-msterminal': return true;// trm
+			case 'application/x-mswrite': return true;// wri
+			case 'application/x-netcdf': return true;// cdf nc
+			case 'application/x-nzb': return true;// nzb
+			case 'application/x-pkcs12': return true;// pfx p12
+			case 'application/x-pkcs7-certificates': return true;// spc p7b
+			case 'application/x-pkcs7-certreqresp': return true;// p7r
+			case 'application/x-rar': return true;// rar
+			case 'application/x-rar-compressed': return true;// rar
+			case 'application/x-research-info-systems': return true;// ris
+			case 'application/x-sh': return true;// sh
+			case 'application/x-shar': return true;// shar
+			case 'application/x-shockwave-flash': return true;// swf
+			case 'application/x-silverlight-app': return true;// xap
+			case 'application/x-sql': return true;// sql
+			case 'application/x-stuffit': return true;// sit
+			case 'application/x-stuffitx': return true;// sitx
+			case 'application/x-subrip': return true;// srt
+			case 'application/x-sv4cpio': return true;// sv4cpio
+			case 'application/x-sv4crc': return true;// sv4crc
+			case 'application/x-t3vm-image': return true;// t3
+			case 'application/x-tads': return true;// gam
+			case 'application/x-tar': return true;// tar
+			case 'application/x-tcl': return true;// tcl
+			case 'application/x-tex': return true;// tex
+			case 'application/x-tex-tfm': return true;// tfm
+			case 'application/x-texinfo': return true;// texi texinfo
+			case 'application/x-tgif': return true;// obj
+			case 'application/x-ustar': return true;// ustar
+			case 'application/x-wais-source': return true;// src
+			case 'application/x-x509-ca-cert': return true;// crt der
+			case 'application/x-xfig': return true;// fig
+			case 'application/x-xliff+xml': return true;// xlf
+			case 'application/x-xpinstall': return true;// xpi
+			case 'application/x-xz': return true;// xz
+			case 'application/x-zmachine': return true;// z8 z1 z2 z3 z4 z5 z6 z7
+			case 'application/xaml+xml': return true;// xaml
+			case 'application/xcap-diff+xml': return true;// xdf
+			case 'application/xenc+xml': return true;// xenc
+			case 'application/xhtml+xml': return true;// xht xhtml
+			case 'application/xml': return true;// xsl xml
+			case 'application/xml-dtd': return true;// dtd
+			case 'application/xop+xml': return true;// xop
+			case 'application/xproc+xml': return true;// xpl
+			case 'application/xslt+xml': return true;// xslt
+			case 'application/xspf+xml': return true;// xspf
+			case 'application/xv+xml': return true;// xvm mxml xhvml xvml
+			case 'application/yang': return true;// yang
+			case 'application/yin+xml': return true;// yin
+			case 'application/zip': return true;// zip
+			case 'audio/adpcm': return true;// adp
+			case 'audio/basic': return true;// snd au
+			case 'audio/midi': return true;// rmi mid midi kar
+			case 'audio/mp4': return true;// mp4a m4a
+			case 'audio/mpeg': return true;// m3a mpga mp2 mp2a mp3 m2a
+			case 'audio/ogg': return true;// spx oga ogg
+			case 'audio/s3m': return true;// s3m
+			case 'audio/silk': return true;// sil
+			case 'audio/vnd.dece.audio': return true;// uvva uva
+			case 'audio/vnd.digital-winds': return true;// eol
+			case 'audio/vnd.dra': return true;// dra
+			case 'audio/vnd.dts': return true;// dts
+			case 'audio/vnd.dts.hd': return true;// dtshd
+			case 'audio/vnd.lucent.voice': return true;// lvp
+			case 'audio/vnd.ms-playready.media.pya': return true;// pya
+			case 'audio/vnd.nuera.ecelp4800': return true;// ecelp4800
+			case 'audio/vnd.nuera.ecelp7470': return true;// ecelp7470
+			case 'audio/vnd.nuera.ecelp9600': return true;// ecelp9600
+			case 'audio/vnd.rip': return true;// rip
+			case 'audio/webm': return true;// weba
+			case 'audio/x-aac': return true;// aac
+			case 'audio/x-aiff': return true;// aifc aif aiff
+			case 'audio/x-caf': return true;// caf
+			case 'audio/x-flac': return true;// flac
+			case 'audio/x-matroska': return true;// mka
+			case 'audio/x-mpegurl': return true;// m3u
+			case 'audio/x-ms-wax': return true;// wax
+			case 'audio/x-ms-wma': return true;// wma
+			case 'audio/x-pn-realaudio': return true;// ra ram
+			case 'audio/x-pn-realaudio-plugin': return true;// rmp
+			case 'audio/x-wav': return true;// wav
+			case 'audio/xm': return true;// xm
+			case 'chemical/x-cdx': return true;// cdx
+			case 'chemical/x-cif': return true;// cif
+			case 'chemical/x-cmdf': return true;// cmdf
+			case 'chemical/x-cml': return true;// cml
+			case 'chemical/x-csml': return true;// csml
+			case 'chemical/x-xyz': return true;// xyz
+			case 'image/bmp': return true;// bmp
+			case 'image/cgm': return true;// cgm
+			case 'image/g3fax': return true;// g3
+			case 'image/gif': return true;// gif
+			case 'image/ief': return true;// ief
+			case 'image/jpeg': return true;// jpe jpeg jpg
+			case 'image/ktx': return true;// ktx
+			case 'image/png': return true;// png
+			case 'image/prs.btif': return true;// btif
+			case 'image/sgi': return true;// sgi
+			case 'image/svg+xml': return true;// svgz svg
+			case 'image/tiff': return true;// tif tiff
+			case 'image/vnd.adobe.photoshop': return true;// psd
+			case 'image/vnd.dece.graphic': return true;// uvvg uvi uvvi uvg
+			case 'image/vnd.djvu': return true;// djv djvu
+			case 'image/vnd.dvb.subtitle': return true;// sub
+			case 'image/vnd.dwg': return true;// dwg
+			case 'image/vnd.dxf': return true;// dxf
+			case 'image/vnd.fastbidsheet': return true;// fbs
+			case 'image/vnd.fpx': return true;// fpx
+			case 'image/vnd.fst': return true;// fst
+			case 'image/vnd.fujixerox.edmics-mmr': return true;// mmr
+			case 'image/vnd.fujixerox.edmics-rlc': return true;// rlc
+			case 'image/vnd.ms-modi': return true;// mdi
+			case 'image/vnd.ms-photo': return true;// wdp
+			case 'image/vnd.net-fpx': return true;// npx
+			case 'image/vnd.wap.wbmp': return true;// wbmp
+			case 'image/vnd.xiff': return true;// xif
+			case 'image/webp': return true;// webp
+			case 'image/x-3ds': return true;// 3ds
+			case 'image/x-cmu-raster': return true;// ras
+			case 'image/x-cmx': return true;// cmx
+			case 'image/x-freehand': return true;// fh7 fh fhc fh4 fh5
+			case 'image/x-ico': return true;// ico
+			case 'image/x-icon': return true;// ico
+			case 'image/x-mrsid-image': return true;// sid
+			case 'image/x-ms-bmp': return true;// bmp
+			case 'image/x-pcx': return true;// pcx
+			case 'image/x-pict': return true;// pct pic
+			case 'image/x-portable-anymap': return true;// pnm
+			case 'image/x-portable-bitmap': return true;// pbm
+			case 'image/x-portable-graymap': return true;// pgm
+			case 'image/x-portable-greymap': return true;// pgm
+			case 'image/x-portable-pixmap': return true;// ppm
+			case 'image/x-rgb': return true;// rgb
+			case 'image/x-tga': return true;// tga
+			case 'image/x-xbitmap': return true;// xbm
+			case 'image/x-xpixmap': return true;// xpm
+			case 'image/x-xwindowdump': return true;// xwd
+			case 'inode/x-empty': return false;// empty file
+			case 'message/rfc822': return true;// mime eml
+			case 'model/iges': return true;// iges igs
+			case 'model/mesh': return true;// silo msh mesh
+			case 'model/vnd.collada+xml': return true;// dae
+			case 'model/vnd.dwf': return true;// dwf
+			case 'model/vnd.gdl': return true;// gdl
+			case 'model/vnd.gtw': return true;// gtw
+			case 'model/vnd.mts': return true;// mts
+			case 'model/vnd.vtu': return true;// vtu
+			case 'model/vrml': return true;// vrml wrl
+			case 'model/x3d+binary': return true;// x3dbz x3db
+			case 'model/x3d+vrml': return true;// x3dvz x3dv
+			case 'model/x3d+xml': return true;// x3dz x3d
+			case 'text/cache-manifest': return true;// appcache
+			case 'text/calendar': return true;// ifb ics
+			case 'text/css': return true;// css
+			case 'text/csv': return true;// csv
+			case 'text/html': return true;// htm html
+			case 'text/n3': return true;// n3
+			case 'text/plain': return true;// in txt text conf def list log
+			case 'text/prs.lines.tag': return true;// dsc
+			case 'text/rtf': return true;// rtf
+			case 'text/richtext': return true;// rtx
+			case 'text/sgml': return true;// sgm sgml
+			case 'text/tab-separated-values': return true;// tsv
+			case 'text/troff': return true;// ms t tr roff man me
+			case 'text/turtle': return true;// ttl
+			case 'text/uri-list': return true;// urls uri uris
+			case 'text/vcard': return true;// vcard
+			case 'text/vnd.curl': return true;// curl
+			case 'text/vnd.curl.dcurl': return true;// dcurl
+			case 'text/vnd.curl.mcurl': return true;// mcurl
+			case 'text/vnd.curl.scurl': return true;// scurl
+			case 'text/vnd.dvb.subtitle': return true;// sub
+			case 'text/vnd.fly': return true;// fly
+			case 'text/vnd.fmi.flexstor': return true;// flx
+			case 'text/vnd.graphviz': return true;// gv
+			case 'text/vnd.in3d.3dml': return true;// 3dml
+			case 'text/vnd.in3d.spot': return true;// spot
+			case 'text/vnd.sun.j2me.app-descriptor': return true;// jad
+			case 'text/vnd.wap.wml': return true;// wml
+			case 'text/vnd.wap.wmlscript': return true;// wmls
+			case 'text/x-asm': return true;// s asm
+			case 'text/x-c': return true;// c cc cxx cpp h hh dic
+			case 'text/x-c++': return true;// c++
+			case 'text/x-fortran': return true;// f for f77 f90
+			case 'text/x-java': return true;// java
+			case 'text/x-java-source': return true;// java
+			case 'text/x-makefile': return true;// Makefile
+			case 'text/x-nfo': return true;// nfo
+			case 'text/x-opml': return true;// opml
+			case 'text/x-pascal': return true;// p pas
+			case 'text/x-php': return true;// php
+			case 'text/x-python': return true;// py
+			case 'text/x-setext': return true;// etx
+			case 'text/x-sfv': return true;// sfv
+			case 'text/x-shellscript': return true;// ...
+			case 'text/x-uuencode': return true;// uu
+			case 'text/x-vcalendar': return true;// vcs
+			case 'text/x-vcard': return true;// vcf
+			case 'video/3gpp': return true;// 3gp
+			case 'video/3gpp2': return true;// 3g2
+			case 'video/h261': return true;// h261
+			case 'video/h263': return true;// h263
+			case 'video/h264': return true;// h264
+			case 'video/jpeg': return true;// jpgv
+			case 'video/jpm': return true;// jpm jpgm
+			case 'video/mj2': return true;// mjp2 mj2
+			case 'video/mp4': return true;// mpg4 mp4 mp4v
+			case 'video/mpeg': return true;// m2v mpeg mpg mpe m1v
+			case 'video/ogg': return true;// ogv
+			case 'video/quicktime': return true;// mov qt
+			case 'video/vnd.dece.hd': return true;// uvvh uvh
+			case 'video/vnd.dece.mobile': return true;// uvvm uvm
+			case 'video/vnd.dece.pd': return true;// uvvp uvp
+			case 'video/vnd.dece.sd': return true;// uvvs uvs
+			case 'video/vnd.dece.video': return true;// uvvv uvv
+			case 'video/vnd.dvb.file': return true;// dvb
+			case 'video/vnd.fvt': return true;// fvt
+			case 'video/vnd.mpegurl': return true;// m4u mxu
+			case 'video/vnd.ms-playready.media.pyv': return true;// pyv
+			case 'video/vnd.uvvu.mp4': return true;// uvvu uvu
+			case 'video/vnd.vivo': return true;// viv
+			case 'video/webm': return true;// webm
+			case 'video/x-f4v': return true;// f4v
+			case 'video/x-fli': return true;// fli
+			case 'video/x-flv': return true;// flv
+			case 'video/x-m4v': return true;// m4v
+			case 'video/x-matroska': return true;// mks mkv mk3d
+			case 'video/x-mng': return true;// mng
+			case 'video/x-ms-asf': return true;// asx asf
+			case 'video/x-ms-vob': return true;// vob
+			case 'video/x-ms-wm': return true;// wm
+			case 'video/x-ms-wmv': return true;// wmv
+			case 'video/x-ms-wmx': return true;// wmx
+			case 'video/x-ms-wvx': return true;// wvx
+			case 'video/x-msvideo': return true;// avi
+			case 'video/x-sgi-movie': return true;// movie
+			case 'video/x-smv': return true;// smv
+			case 'x-conference/x-cooltalk': return true;// ice
+		}
+		return false;
+	}
+
+}

+ 45 - 5
SE/se-lib/Response.php

@@ -1,11 +1,11 @@
 <?php
 
 /**
- * examples:
- *  Response::sendJson($data);
- *  Response::sendPlainText($data);
- *  Response::sendJsonExit($data);
- *  Response::sendPlainTextExit($data);
+ * @example: Response::sendJson($data);
+ * @example: Response::sendPlainText($data);
+ * @example: Response::sendJsonExit($data);
+ * @example: Response::sendPlainTextExit($data);
+ * @example: Response::sendTryCatchJson(array($this, 'methodNameReponseCallback'), $args);
  */
 class Response {
 
@@ -31,4 +31,44 @@ class Response {
 		exit;
 	}
 
+	public static function sendTryCatchJson($callback, $args = array()) {// @param callback must return $response object to send as json or throw exception
+		$response = array();
+		try {
+			if (!is_callable($callback)) throw new Exception("#1L" . __LINE__ . " Callback is not callable");
+			$response = call_user_func_array($callback, $args);
+		} catch (AlertDangerException $e) {
+			Http::sendHeaderByCode(200);
+			$response['type'] = 'danger';
+			$response['msg'] = $e->getMessage();
+			$response['code'] = "#" . $e->getCode() . "L" . $e->getLine();
+			Response::sendJsonExit($response);
+		} catch (AlertSuccessException $e) {
+			Http::sendHeaderByCode(200);
+			$response['type'] = 'success';
+			$response['msg'] = $e->getMessage();
+			$response['code'] = "#" . $e->getCode() . "L" . $e->getLine();
+			Response::sendJsonExit($response);
+		} catch (AlertInfoException $e) {
+			Http::sendHeaderByCode(200);
+			$response['type'] = 'info';
+			$response['msg'] = $e->getMessage();
+			$response['code'] = "#" . $e->getCode() . "L" . $e->getLine();
+			Response::sendJsonExit($response);
+		} catch (AlertWarningException $e) {
+			Http::sendHeaderByCode(200);
+			$response['type'] = 'warning';
+			$response['msg'] = $e->getMessage();
+			$response['code'] = "#" . $e->getCode() . "L" . $e->getLine();
+			Response::sendJsonExit($response);
+		} catch (Exception $e) {
+			Http::sendHeaderByCode(500);
+			$response['type'] = 'danger';
+			$response['msg'] = $e->getMessage();
+			$response['code'] = "#" . $e->getCode() . "L" . $e->getLine();
+			Response::sendJsonExit($response);
+		}
+		Http::sendHeaderByCode(200);
+		Response::sendJsonExit($response);
+	}
+
 }

+ 59 - 1062
SE/se-lib/Route/FileStorage.php

@@ -6,27 +6,10 @@ Lib::loadClass('Response');
 Lib::loadClass('Request');
 Lib::loadClass('UI');
 Lib::loadClass('Http');
+Lib::loadClass('FileStorage');
 
 /*
-# FileStorage:
-- [x] create CRM_FILES - sql at the end of file
-  - [x] only meta fields, perms? - no perms in relation based on record which is connected
-- [x] add file to storage - API POST/PUT action
-  - [ ] base storage folder - from config - default /Library/Server/Web/Data/p5-pliki, chmod - add to instalator, upgrade
-	- [x] subfolders like postfix, but [0-9],[A-Z] - substr(strrev(base_convert($id, 10, 10 + 26)), 0, 1) - 36 folderów
-	- [x] file connected to user - A_RECORD_CREATE_AUTHOR
-	- [ ] ? file connected to user - A_OWNER (L_APP_USER)?
-- [ ] connect file to record - {tbl_name}__REF__FILES
-  - [ ] add A_HAS_REF field to struct - cache to check if file is connected to some record
-	- [ ] add sync state - remote file name, mtime to check if file has changed in Storage or remote record folder
-	- [ ] sync - conflict - file connected with 2 objects and both changed and try to store changes to FileStorage
-	  - [ ] add version to REF table
-- [x] use streams for upload - better memory usage
-- [ ] use streams for upload progress in form - http://www.webiny.com/blog/2012/05/07/webiny-file-upload-with-html5-and-ajax-using-php-streams/
-- [x] add IP to table struct
-
 # upload API: `index.php?_route=FileStorage&_task=upload&name={file_name}`
-
 */
 class Route_FileStorage extends RouteBase {
 
@@ -47,144 +30,33 @@ class Route_FileStorage extends RouteBase {
 		UI::dol();
 	}
 
-	public function isProduction() {// TODO: mv to Config
-		// return V::get('P5_ENV', '/Library/Server/Web/Data/p5-file-storage', $_SERVER);
-		// $env = getenv('P5_ENV');
-		// if (empty($env)) $env = 'production';
-		return ('production' == V::get('P5_ENV', 'production', $_SERVER));
-	}
-
-	public function getRootStoragePath() {
-		return ($this->isProduction()) ? '/Library/Server/Web/Data/p5-file-storage' : '/tmp/test-upload-file-storage';
-	}
-
-	public function getTableName() {
-		return ($this->isProduction()) ? 'CRM_FILES' : 'CRM_FILES__#DEV';
-	}
-
-	public function addFileStream($inputHandler, $name = '') {
-		$rootFileStoragePath = $this->getRootStoragePath();
-
-		$sqlLogin = User::getLogin();
-		$sqlIP = Request::getUserIp();
-		$sqlLabel = DB::getPDO()->quote($name, PDO::PARAM_STR);
-		$sqlTblName = $this->getTableName();
-		$sql = "
-			insert into `{$sqlTblName}` (`A_RECORD_CREATE_AUTHOR`,`A_RECORD_CREATE_DATE`,`FILE_LABEL`, `A_USER_IP`)
-			values ('{$sqlLogin}', NOW(), {$sqlLabel}, INET_ATON('{$sqlIP}'))
-		";
-		DBG::_('DBG', '>2', "sql", $sql, __CLASS__, __FUNCTION__, __LINE__);
-		DB::getPDO()->exec($sql);
-		$dbLastId = DB::getPDO()->lastInsertId();
-		DBG::_('DBG', '>1', "dbLastId", $dbLastId, __CLASS__, __FUNCTION__, __LINE__);
-		$filePath = $this->generateFilePathHashFromID($dbLastId);
-		DBG::_('DBG', '>1', "filePath", $filePath, __CLASS__, __FUNCTION__, __LINE__);
-
-		$absFilePath = "{$rootFileStoragePath}/{$filePath}";
-		$dirPath = dirname($absFilePath);
-		@mkdir($dirPath, $mode = 0775, $recursive = true);
-		if (!file_exists($dirPath)) throw new Exception("Cannot create path");
-		@chmod($dirPath, $mode = 0775);
-
-		// create a temp file where to save data from the input stream
-		$fileHandler = fopen($absFilePath, "w+");
-		DBG::_('DBG', '>1', "absFilePath", $absFilePath, __CLASS__, __FUNCTION__, __LINE__);
-
-		// save data from the input stream
-		while (true) {
-			$buffer = fgets($inputHandler, 4096);
-			if (strlen($buffer) == 0) {
-				fclose($inputHandler);
-				fclose($fileHandler);
-				break;
-			}
-			fwrite($fileHandler, $buffer);
-		}
-
-		if (!file_exists($absFilePath)) throw new Exception("Cannot save file");
-
-		$mimeType = mime_content_type($absFilePath);
-		DBG::_('DBG', '>1', "mimeType", $mimeType, __CLASS__, __FUNCTION__, __LINE__);
-		if (!$this->isAllowedMimeType($mimeType)) {
-			DB::getPDO()->exec("
-				update `{$sqlTblName}`
-				set `A_STATUS` = 'WARNING'
-			--		, `A_STATUS_INFO` = ''
-				where `ID` = '{$dbLastId}'
-			");
-			throw new Exception("Niedozwolony typ pliku '{$mimeType}'", 1);
-		}
-		$mtime = filemtime($absFilePath);
-		$size = filesize($absFilePath);
-		DBG::_('DBG', '>1', "mtime", $mtime, __CLASS__, __FUNCTION__, __LINE__);
-		DBG::_('DBG', '>1', "size", $size, __CLASS__, __FUNCTION__, __LINE__);
-		DB::getPDO()->exec("
-			update `{$sqlTblName}`
-			set `A_STATUS` = 'NORMAL'
-				, `FILE_MIME_TYPE` = '{$mimeType}'
-				, `FILE_MTIME` = '{$mtime}'
-				, `FILE_SIZE` = '{$size}'
-			where `ID` = '{$dbLastId}'
-		");
-		echo "
-			update `{$sqlTblName}`
-			set `A_STATUS` = 'NORMAL'
-				, `FILE_MIME_TYPE` = '{$mimeType}'
-				, `FILE_MTIME` = '{$mtime}'
-				, `FILE_SIZE` = '{$size}'
-			where `ID` = '{$dbLastId}'
-		";
-	}
-
-	public function addFile($content, $name = '') {
-		$rootFileStoragePath = $this->getRootStoragePath();
-
-		$sqlLogin = User::getLogin();
-		$sqlLabel = DB::getPDO()->quote($name, PDO::PARAM_STR);
-		$sqlTblName = $this->getTableName();
-		$sql = "
-			insert into `{$sqlTblName}` (`A_RECORD_CREATE_AUTHOR`,`A_RECORD_CREATE_DATE`,`FILE_LABEL`)
-			values ('{$sqlLogin}', NOW(), {$sqlLabel})
-		";
-		DBG::_('DBG', '>2', "sql", $sql, __CLASS__, __FUNCTION__, __LINE__);
-		DB::getPDO()->exec($sql);
-		$dbLastId = DB::getPDO()->lastInsertId();
-		DBG::_('DBG', '>1', "dbLastId", $dbLastId, __CLASS__, __FUNCTION__, __LINE__);
-		$filePath = $this->generateFilePathHashFromID($dbLastId);
-		DBG::_('DBG', '>1', "filePath", $filePath, __CLASS__, __FUNCTION__, __LINE__);
-
-		$absFilePath = "{$rootFileStoragePath}/{$filePath}";
-		$dirPath = dirname($absFilePath);
-		@mkdir($dirPath, $mode = 0777, $recursive = true);
-		if (!file_exists($dirPath)) throw new Exception("Cannot create path");
-		@chmod($dirPath, $mode = 0777);
-
-		$fp = fopen($absFilePath, 'w');
-		fwrite($fp, $fileContent);
-		fclose($fp);
-
-		if (!file_exists($absFilePath)) throw new Exception("Cannot save file");
+	public function uploadStreamAction() {
+		Response::sendTryCatchJson(array($this, 'uploadStreamResponseCallback'));
 	}
 
-	public function uploadStreamAction() {
-		try {
-			$sqlLabel = V::get('name', '', $_REQUEST);
-			// read contents from the input stream
-			$inputHandler = fopen('php://input', "r");
-			$this->addFileStream($inputHandler, $sqlLabel);
-		} catch (Exception $e) {
-			Http::sendHeaderByCode(500);
-			echo "Error #" . $e->getCode() .  "|" . $e->getLine() .  ": " . $e->getMessage();
-			exit;
+	public function uploadStreamResponseCallback() {
+		$response = array();
+		$response['type'] = 'danger';
+		$response['msg'] = "Wystąpił nieznany błąd podczas wgrywania pliku";
+
+		$sqlLabel = V::get('name', '', $_REQUEST);
+		// read contents from the input stream
+		$inputHandler = fopen('php://input', "r");
+		$idFile = FileStorage::addFileStream($inputHandler, $sqlLabel);
+		$response['id'] = $idFile;
+		$fileObject = FileStorage::getFileById($idFile);
+		if ($fileObject['exists']) {
+			$response['type'] = 'success';
+			$response['msg'] = "Wgrano plik nr {$idFile}";
 		}
-		Http::sendHeaderByCode(200);
+		return $response;
 	}
 
 	public function uploadAction() {
 		try {
 			$fileContent = Request::getRequestBody();
 			$sqlLabel = V::get('name', '', $_REQUEST);
-			$this->addFile($fileContent, $sqlLabel);
+			FileStorage::addFile($fileContent, $sqlLabel);
 			echo 'file uploaded';
 		} catch (Exception $e) {
 			echo "Error #" . $e->getCode() .  "|" . $e->getLine() .  ": " . $e->getMessage();
@@ -194,7 +66,7 @@ class Route_FileStorage extends RouteBase {
 	public function uploadFromBinaryTestAction() {
 		try {
 			$fileContent = Request::getRequestBody();
-			$filePath = $this->getRootStoragePath() . '/test-upload-data.txt';
+			$filePath = FileStorage::getRootStoragePath() . '/test-upload-data.txt';
 			$fp = fopen($filePath, 'w');
 			fwrite($fp, $fileContent);
 			fclose($fp);
@@ -210,41 +82,28 @@ class Route_FileStorage extends RouteBase {
 			$id = V::get('id', 0, $_REQUEST, 'int');
 			if ($id <= 0) throw new Exception("Error Wrong file id");
 
-			$sqlId = DB::getPDO()->quote($id, PDO::PARAM_INT);
-			$sqlTblName = $this->getTableName();
-			$rows = DB::getPDO()->fetchAll("
-				select f.*
-				from `{$sqlTblName}` f
-				where f.ID = {$sqlId}
-			");
-			DBG::_('DBG', '>2', "rows", $rows, __CLASS__, __FUNCTION__, __LINE__);
-			if (empty($rows)) throw new HttpException("Plik nie istnieje", 404);
-			$file = $rows[0];
-			// TODO: check perms
-			$fileName = V::get('FILE_LABEL', $id, $file);
-			$rootFileStoragePath = $this->getRootStoragePath();
-			$filePath = $this->generateFilePathHashFromID($file['ID']);
-			$absFilePath = "{$rootFileStoragePath}/{$filePath}";
-			if (!file_exists($absFilePath)) throw new Exception("file not exists!");
+			$fileObject = FileStorage::getFileById($id);
+			if (!$fileObject['exists']) throw new HttpException("File not exists", 404);
 			header('Content-Description: File Transfer');
-			$fileMimeType = ($file['FILE_SIZE']) ? $file['FILE_SIZE'] : filesize($absFilePath);
-			header('Content-Type: ' . $fileMimeType);
-			header('Content-Disposition: attachment; filename="' . $fileName . '"');
+			header('Content-Type: ' . $fileObject['mimeType']);
+			header('Content-Disposition: attachment; filename="' . $fileObject['name'] . '"');
 			header('Expires: 0');
 			header('Cache-Control: must-revalidate');
 			header('Pragma: public');
-			$fileSize = ($file['FILE_MIME_TYPE']) ? $file['FILE_MIME_TYPE'] : filesize($absFilePath);
-			header('Content-Length: ' . $fileSize);
-			readfile($absFilePath);
+			header('Content-Length: ' . $fileObject['size']);
+			readfile($fileObject['absolutePath']);
 			exit;
+		} catch (HttpException $e) {
+			Http::sendHeaderByCode($e->getCode());
+			die($e->getMessage());
 		} catch (Exception $e) {
-			echo "Error #" . $e->getCode() .  "|" . $e->getLine() .  ": " . $e->getMessage();
+			die("Error #" . $e->getCode() .  "|" . $e->getLine() .  ": " . $e->getMessage());
 		}
 	}
 
 	public function downloadTestAction() {
 		try {
-			$filePath = $this->getRootStoragePath() . '/test-upload-data.txt';
+			$filePath = FileStorage::getRootStoragePath() . '/test-upload-data.txt';
 			if (!file_exists($filePath)) throw new Exception("file not exists!");
 	    header('Content-Description: File Transfer');
 	    header('Content-Type: application/octet-stream');
@@ -265,7 +124,7 @@ class Route_FileStorage extends RouteBase {
 			// $fileContent = Request::getRequestBody();
 			DBG::_(true, true, '_POST', $_POST, __CLASS__, __FUNCTION__, __LINE__);
 
-			// $filePath = $this->getRootStoragePath() . '/test-upload-data.txt';
+			// $filePath = FileStorage::getRootStoragePath() . '/test-upload-data.txt';
 			// $fp = fopen($filePath, 'w');
 			// fwrite($fp, $fileContent);
 			// fclose($fp);
@@ -292,14 +151,23 @@ class Route_FileStorage extends RouteBase {
 	<button class="btn btn-default" id="upload_file_as_form_btn">upload as form</button>
 	<a class="btn btn-default" href="index.php?_route=FileStorage&_task=downloadTest" target="_blank">download</a>
 	<blockquote>
-		<p>root storage path: <code><?php echo $this->getRootStoragePath(); ?></code></p>
-		<p>table name: <code><?php echo $this->getTableName(); ?></code></p>
+		<p>root storage path: <code><?php echo FileStorage::getRootStoragePath(); ?></code></p>
+		<p>table name: <code><?php echo FileStorage::getTableName(); ?></code></p>
 		<p>IP: <code><?php echo Request::getUserIp(); ?></code></p>
 	</blockquote>
 </div>
 <?php
-$sqlTblName = $this->getTableName();
-$rows = DB::getPDO()->fetchAll("
+$sqlTblName = FileStorage::getTableName();
+$params = array();
+$params['caption'] = "Files in '{$sqlTblName}'";
+$params['rows'] = array_map(function($row) {
+	$row['FILE_SIZE'] = V::humanFileSize($row['FILE_SIZE']);
+	unset($row['FILE_HASH']);
+	$row['rel_path'] = FileStorage::generateFilePathHashFromId($row['ID']);
+	$downloadLink = "index.php?_route=FileStorage&_task=download&id={$row['ID']}";
+	$row['download'] = '<a href="' . $downloadLink . '" target="_blank">download</a>';
+	return $row;
+}, DB::getPDO()->fetchAll("
 	select t.ID
 		, t.FILE_HASH
 		, t.FILE_LABEL
@@ -319,19 +187,7 @@ $rows = DB::getPDO()->fetchAll("
 	from `{$sqlTblName}` t
 	order by ID DESC
 	limit 100
-");
-foreach ($rows as $idx => $row) {
-	$rows[$idx]['FILE_SIZE'] = V::humanFileSize($row['FILE_SIZE']);
-}
-
-$params = array();
-$params['caption'] = "Files in '" . $this->getTableName() . "'";
-$params['rows'] = $rows;
-foreach ($params['rows'] as $idx => $row) {
-	$downloadLink = "index.php?_route=FileStorage&_task=download&id={$row['ID']}";
-	$row['download'] = '<a href="' . $downloadLink . '" target="_blank">download</a>';
-	$params['rows'][$idx] = $row;
-}
+"));
 UI::table($params);
 ?>
 <script>
@@ -363,7 +219,7 @@ function uploadFileAsForm(file) {
   xhr.send(fd);
 }
 function uploadFileAsStream(file) {
-	var serverUrl = '<?php echo Request::getPathUri() . "index.php?_route=FileStorage&_task=uploadStream&DBG=3"; ?>';
+	var serverUrl = '<?php echo Request::getPathUri() . "index.php?_route=FileStorage&_task=uploadStream"; ?>';
 	var _dbg = true;
 
 	// .set('Accept', 'application/json')
@@ -372,6 +228,16 @@ function uploadFileAsStream(file) {
 		.send(file)
 		.end(function(err, res) {
 			if(_dbg)console.log('DBG: res:', res, 'res.body:', res.body);
+			if (res.status != 200) {
+				jQuery.notify("Wystąpił błąd: " + res.text, 'error')
+			} else if (res.body && res.body.msg && res.body.type) {
+				var notifyType = ('danger' == res.body.type) ? 'error' : res.body.type;
+				jQuery.notify(res.body.msg, notifyType)
+			} else if (res.body && res.body.id && res.body.id > 0) {
+				jQuery.notify("Wgrano plik:" + JSON.stringify(res.body), 'success')
+			} else {
+				jQuery.notify("Wystąpił błąd: " + JSON.stringify(res.body), 'error')
+			}
 		})
 }
 function uploadFileAsBinary(file) {
@@ -442,20 +308,6 @@ jQuery('#upload_file_as_form_btn').on('click', function() {
 		UI::dol();
 	}
 
-	public function generateFilePathHashFromID($intId) {
-		// $base36Id = base_convert($intId, 10, 10 + 26);// 0-9 + A-Z
-		$base36Id = base_convert($intId, 10, 10 + 6);// 0-9 + A-F
-		$base36Str = str_pad($base36Id, 10, "0", STR_PAD_LEFT);
-		$base36Str = strrev($base36Str);
-		$pathParts = array();
-		$pathParts[] = substr($base36Str, 0, 2);
-		$pathParts[] = substr($base36Str, 2, 2);
-		$pathParts[] = substr($base36Str, 4);
-		$hashPath = implode("/", $pathParts);
-		echo "ID($intId) converted to ({$base36Id})\t to ({$base36Str})\t to path ({$hashPath})\n";
-		return $hashPath;
-	}
-
 	public function generatePathTestAction() {
 		try {
 			$start = 0;
@@ -463,7 +315,7 @@ jQuery('#upload_file_as_form_btn').on('click', function() {
 			$limit = $start + 100;
 			echo '<pre>';
 			for ($i = $start; $i < $limit; $i++) {
-				$this->generateFilePathHashFromID($i);
+				FileStorage::generateFilePathHashFromId($i);
 			}
 			echo '</pre>';
 		} catch (Exception $e) {
@@ -474,863 +326,8 @@ jQuery('#upload_file_as_form_btn').on('click', function() {
 	public function reinstallAction() {
 		UI::gora();
 		UI::menu();
-		$this->reinstall();
+		FileStorage::reinstall();
 		UI::dol();
 	}
 
-	public function reinstall() {
-		try {
-			DB::getPDO()->exec("
-CREATE TABLE IF NOT EXISTS `CRM_FILES` (
-	`ID` int(11) NOT NULL AUTO_INCREMENT,
-	`FILE_HASH` varchar(255) NOT NULL, -- generated from ID by hash function - only for cache
-	`FILE_LABEL` varchar(255) NOT NULL, -- original file name or system name
-	`FILE_TYPE` varchar(32) NOT NULL DEFAULT '', -- $TRG_FILE -> config/.cnf--folders...
-	`FILE_MIME_TYPE` varchar(64) NOT NULL DEFAULT '',
-	`FILE_MTIME` datetime NOT NULL,
-	`FILE_SIZE` bigint NOT NULL DEFAULT 0,
-	`FILE_VERSION` int(11) NOT NULL DEFAULT 0, -- used for update
-	`A_STATUS` enum('WAITING','NORMAL','MONITOR','OFF_HARD','OFF_SOFT','DELETED') NOT NULL DEFAULT 'WAITING',
-	`A_RECORD_CREATE_DATE` datetime DEFAULT NULL,
-	`A_RECORD_CREATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
-	`A_RECORD_UPDATE_DATE` datetime DEFAULT NULL,
-	`A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
-	`A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT '',
-	`A_CLASSIFIED` varchar(100) NOT NULL DEFAULT '',
-	`A_USER_IP` bigint NOT NULL DEFAULT '0',
-	PRIMARY KEY (`ID`),
-	KEY `FILE_TYPE` (`FILE_MIME_TYPE`)
-) ENGINE=MyISAM  DEFAULT CHARSET=latin2;
-			");
-			DB::getPDO()->exec("
-CREATE TABLE IF NOT EXISTS `CRM_FILES__#DEV` (
-	`ID` int(11) NOT NULL AUTO_INCREMENT,
-	`FILE_HASH` varchar(255) NOT NULL, -- generated from ID by hash function - only for cache
-  `FILE_LABEL` varchar(255) NOT NULL, -- original file name or system name
-  `FILE_TYPE` varchar(32) NOT NULL DEFAULT '', -- $TRG_FILE -> config/.cnf--folders...
-	`FILE_MIME_TYPE` varchar(64) NOT NULL DEFAULT '',
-	`FILE_MTIME` datetime NOT NULL,
-	`FILE_SIZE` bigint NOT NULL DEFAULT 0,
-	`FILE_VERSION` int(11) NOT NULL DEFAULT 0, -- used for update
-	`A_STATUS` enum('WAITING','NORMAL','MONITOR','OFF_HARD','OFF_SOFT','DELETED') NOT NULL DEFAULT 'WAITING',
-	`A_RECORD_CREATE_DATE` datetime DEFAULT NULL,
-	`A_RECORD_CREATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
-	`A_RECORD_UPDATE_DATE` datetime DEFAULT NULL,
-	`A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
-	`A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT '',
-	`A_CLASSIFIED` varchar(100) NOT NULL DEFAULT '',
-	`A_USER_IP` bigint NOT NULL DEFAULT '0',
-	PRIMARY KEY (`ID`),
-	KEY `FILE_TYPE` (`FILE_MIME_TYPE`)
-) ENGINE=MyISAM  DEFAULT CHARSET=latin2;
-			");
-
-			{// TODO: only in cli mode - require root perms
-				$devRootPath = '/tmp/test-upload-file-storage';
-				if (!file_exists($devRootPath)) {
-					@mkdir($devRootPath, $mode = 0777, $recursive = true);
-					if (!file_exists($devRootPath)) throw new Exception("Cannot create FileStorage root path for dev");
-					@chmod($devRootPath, $mode = 0777);
-					@chown($devRootPath, $user = '_www');
-				}
-
-				$productionRootPath = '/Library/Server/Web/Data/p5-file-storage';
-				if (!file_exists($productionRootPath)) {
-					@mkdir($productionRootPath, $mode = 0775, $recursive = true);
-					if (!file_exists($productionRootPath)) throw new Exception("Cannot create FileStorage root path");
-					@chmod($productionRootPath, $mode = 0775);
-					@chown($productionRootPath, $user = '_www');
-				}
-			}
-		} catch (Exception $e) {
-			UI::alert('danger', $e->getMessage());
-		}
-	}
-
-	public function isAllowedMimeType($mimeType) {
-		// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
-		switch ($mimeType) {
-			case 'image/png': return true;
-			case 'application/atom+xml': return true;// atom
-			case 'application/atomcat+xml': return true;// atomcat
-			case 'application/atomsvc+xml': return true;// atomsvc
-			case 'application/ccxml+xml': return true;// ccxml
-			case 'application/cdmi-capability': return true;// cdmia
-			case 'application/cdmi-container': return true;// cdmic
-			case 'application/cdmi-domain': return true;// cdmid
-			case 'application/cdmi-object': return true;// cdmio
-			case 'application/cdmi-queue': return true;// cdmiq
-			case 'application/cu-seeme': return true;// cu
-			case 'application/davmount+xml': return true;// davmount
-			case 'application/docbook+xml': return true;// dbk
-			case 'application/dssc+der': return true;// dssc
-			case 'application/dssc+xml': return true;// xdssc
-			case 'application/ecmascript': return true;// ecma
-			case 'application/emma+xml': return true;// emma
-			case 'application/epub+zip': return true;// epub
-			case 'application/exi': return true;// exi
-			case 'application/font-tdpfr': return true;// pfr
-			case 'application/font-woff': return true;// woff
-			case 'application/gml+xml': return true;// gml
-			case 'application/gpx+xml': return true;// gpx
-			case 'application/gxf': return true;// gxf
-			case 'application/hyperstudio': return true;// stk
-			case 'application/inkml+xml': return true;// ink inkml
-			case 'application/ipfix': return true;// ipfix
-			case 'application/java-archive': return true;// jar
-			case 'application/java-serialized-object': return true;// ser
-			case 'application/java-vm': return true;// class
-			case 'application/javascript': return true;// js
-			case 'application/json': return true;// json
-			case 'application/jsonml+json': return true;// jsonml
-			case 'application/lost+xml': return true;// lostxml
-			case 'application/mac-binhex40': return true;// hqx
-			case 'application/mac-compactpro': return true;// cpt
-			case 'application/mads+xml': return true;// mads
-			case 'application/marc': return true;// mrc
-			case 'application/marcxml+xml': return true;// mrcx
-			case 'application/mathematica': return true;// ma nb mb
-			case 'application/mathml+xml': return true;// mathml
-			case 'application/mbox': return true;// mbox
-			case 'application/mediaservercontrol+xml': return true;// mscml
-			case 'application/metalink+xml': return true;// metalink
-			case 'application/metalink4+xml': return true;// meta4
-			case 'application/mets+xml': return true;// mets
-			case 'application/mods+xml': return true;// mods
-			case 'application/mp21': return true;// m21 mp21
-			case 'application/mp4': return true;// mp4s
-			case 'application/msword': return true;// doc dot
-			case 'application/mxf': return true;// mxf
-			case 'application/octet-stream': return true;// bin dms lrf mar so dist distz pkg bpk dump elc deploy
-			case 'application/oda': return true;// oda
-			case 'application/oebps-package+xml': return true;// opf
-			case 'application/ogg': return true;// ogx
-			case 'application/omdoc+xml': return true;// omdoc
-			case 'application/onenote': return true;// onetoc2 onetmp onetoc onepkg
-			case 'application/oxps': return true;// oxps
-			case 'application/patch-ops-error+xml': return true;// xer
-			case 'application/pdf': return true;// pdf
-			case 'application/pgp-encrypted': return true;// pgp
-			case 'application/pgp-signature': return true;// asc sig
-			case 'application/pics-rules': return true;// prf
-			case 'application/pkcs10': return true;// p10
-			case 'application/pkcs7-mime': return true;// p7m p7c
-			case 'application/pkcs7-signature': return true;// p7s
-			case 'application/pkcs8': return true;// p8
-			case 'application/pkix-attr-cert': return true;// ac
-			case 'application/pkix-cert': return true;// cer
-			case 'application/pkix-crl': return true;// crl
-			case 'application/pkix-pkipath': return true;// pkipath
-			case 'application/pkixcmp': return true;// pki
-			case 'application/pls+xml': return true;// pls
-			case 'application/postscript': return true;// ai eps ps
-			case 'application/prs.cww': return true;// cww
-			case 'application/pskc+xml': return true;// pskcxml
-			case 'application/rdf+xml': return true;// rdf
-			case 'application/reginfo+xml': return true;// rif
-			case 'application/relax-ng-compact-syntax': return true;// rnc
-			case 'application/resource-lists+xml': return true;// rl
-			case 'application/resource-lists-diff+xml': return true;// rld
-			case 'application/rls-services+xml': return true;// rs
-			case 'application/rpki-ghostbusters': return true;// gbr
-			case 'application/rpki-manifest': return true;// mft
-			case 'application/rpki-roa': return true;// roa
-			case 'application/rsd+xml': return true;// rsd
-			case 'application/rss+xml': return true;// rss
-			case 'application/rtf': return true;// rtf
-			case 'application/sbml+xml': return true;// sbml
-			case 'application/scvp-cv-request': return true;// scq
-			case 'application/scvp-cv-response': return true;// scs
-			case 'application/scvp-vp-request': return true;// spq
-			case 'application/scvp-vp-response': return true;// spp
-			case 'application/sdp': return true;// sdp
-			case 'application/set-payment-initiation': return true;// setpay
-			case 'application/set-registration-initiation': return true;// setreg
-			case 'application/shf+xml': return true;// shf
-			case 'application/smil+xml': return true;// smi smil
-			case 'application/sparql-query': return true;// rq
-			case 'application/sparql-results+xml': return true;// srx
-			case 'application/srgs': return true;// gram
-			case 'application/srgs+xml': return true;// grxml
-			case 'application/sru+xml': return true;// sru
-			case 'application/ssdl+xml': return true;// ssdl
-			case 'application/ssml+xml': return true;// ssml
-			case 'application/tei+xml': return true;// tei teicorpus
-			case 'application/thraud+xml': return true;// tfi
-			case 'application/timestamped-data': return true;// tsd
-			case 'application/vnd.3gpp.pic-bw-large': return true;// plb
-			case 'application/vnd.3gpp.pic-bw-small': return true;// psb
-			case 'application/vnd.3gpp.pic-bw-var': return true;// pvb
-			case 'application/vnd.3gpp2.tcap': return true;// tcap
-			case 'application/vnd.3m.post-it-notes': return true;// pwn
-			case 'application/vnd.accpac.simply.aso': return true;// aso
-			case 'application/vnd.accpac.simply.imp': return true;// imp
-			case 'application/vnd.acucobol': return true;// acu
-			case 'application/vnd.acucorp': return true;// atc acutc
-			case 'application/vnd.adobe.air-application-installer-package+zip': return true;// air
-			case 'application/vnd.adobe.formscentral.fcdt': return true;// fcdt
-			case 'application/vnd.adobe.fxp': return true;// fxp fxpl
-			case 'application/vnd.adobe.xdp+xml': return true;// xdp
-			case 'application/vnd.adobe.xfdf': return true;// xfdf
-			case 'application/vnd.ahead.space': return true;// ahead
-			case 'application/vnd.airzip.filesecure.azf': return true;// azf
-			case 'application/vnd.airzip.filesecure.azs': return true;// azs
-			case 'application/vnd.amazon.ebook': return true;// azw
-			case 'application/vnd.americandynamics.acc': return true;// acc
-			case 'application/vnd.amiga.ami': return true;// ami
-			case 'application/vnd.android.package-archive': return true;// apk
-			case 'application/vnd.anser-web-certificate-issue-initiation': return true;// cii
-			case 'application/vnd.anser-web-funds-transfer-initiation': return true;// fti
-			case 'application/vnd.antix.game-component': return true;// atx
-			case 'application/vnd.apple.installer+xml': return true;// mpkg
-			case 'application/vnd.apple.mpegurl': return true;// m3u8
-			case 'application/vnd.aristanetworks.swi': return true;// swi
-			case 'application/vnd.astraea-software.iota': return true;// iota
-			case 'application/vnd.audiograph': return true;// aep
-			case 'application/vnd.blueice.multipass': return true;// mpm
-			case 'application/vnd.bmi': return true;// bmi
-			case 'application/vnd.businessobjects': return true;// rep
-			case 'application/vnd.chemdraw+xml': return true;// cdxml
-			case 'application/vnd.chipnuts.karaoke-mmd': return true;// mmd
-			case 'application/vnd.cinderella': return true;// cdy
-			case 'application/vnd.claymore': return true;// cla
-			case 'application/vnd.cloanto.rp9': return true;// rp9
-			case 'application/vnd.clonk.c4group': return true;// c4g c4d c4f c4p c4u
-			case 'application/vnd.cluetrust.cartomobile-config': return true;// c11amc
-			case 'application/vnd.cluetrust.cartomobile-config-pkg': return true;// c11amz
-			case 'application/vnd.commonspace': return true;// csp
-			case 'application/vnd.contact.cmsg': return true;// cdbcmsg
-			case 'application/vnd.cosmocaller': return true;// cmc
-			case 'application/vnd.crick.clicker': return true;// clkx
-			case 'application/vnd.crick.clicker.keyboard': return true;// clkk
-			case 'application/vnd.crick.clicker.palette': return true;// clkp
-			case 'application/vnd.crick.clicker.template': return true;// clkt
-			case 'application/vnd.crick.clicker.wordbank': return true;// clkw
-			case 'application/vnd.criticaltools.wbs+xml': return true;// wbs
-			case 'application/vnd.ctc-posml': return true;// pml
-			case 'application/vnd.cups-ppd': return true;// ppd
-			case 'application/vnd.curl.car': return true;// car
-			case 'application/vnd.curl.pcurl': return true;// pcurl
-			case 'application/vnd.dart': return true;// dart
-			case 'application/vnd.data-vision.rdz': return true;// rdz
-			case 'application/vnd.dece.data': return true;// uvf uvvf uvd uvvd
-			case 'application/vnd.dece.ttml+xml': return true;// uvt uvvt
-			case 'application/vnd.dece.unspecified': return true;// uvx uvvx
-			case 'application/vnd.dece.zip': return true;// uvz uvvz
-			case 'application/vnd.denovo.fcselayout-link': return true;// fe_launch
-			case 'application/vnd.dna': return true;// dna
-			case 'application/vnd.dolby.mlp': return true;// mlp
-			case 'application/vnd.dpgraph': return true;// dpg
-			case 'application/vnd.dreamfactory': return true;// dfac
-			case 'application/vnd.ds-keypoint': return true;// kpxx
-			case 'application/vnd.dvb.ait': return true;// ait
-			case 'application/vnd.dvb.service': return true;// svc
-			case 'application/vnd.dynageo': return true;// geo
-			case 'application/vnd.ecowin.chart': return true;// mag
-			case 'application/vnd.enliven': return true;// nml
-			case 'application/vnd.epson.esf': return true;// esf
-			case 'application/vnd.epson.msf': return true;// msf
-			case 'application/vnd.epson.quickanime': return true;// qam
-			case 'application/vnd.epson.salt': return true;// slt
-			case 'application/vnd.epson.ssf': return true;// ssf
-			case 'application/vnd.eszigno3+xml			es3': return true;// et3
-			case 'application/vnd.ezpix-album': return true;// ez2
-			case 'application/vnd.ezpix-package': return true;// ez3
-			case 'application/vnd.fdf': return true;// fdf
-			case 'application/vnd.fdsn.mseed': return true;// mseed
-			case 'application/vnd.fdsn.seed': return true;// seed dataless
-			case 'application/vnd.flographit': return true;// gph
-			case 'application/vnd.fluxtime.clip': return true;// ftc
-			case 'application/vnd.framemaker': return true;// fm frame maker book
-			case 'application/vnd.frogans.fnc': return true;// fnc
-			case 'application/vnd.frogans.ltf': return true;// ltf
-			case 'application/vnd.fsc.weblaunch': return true;// fsc
-			case 'application/vnd.fujitsu.oasys': return true;// oas
-			case 'application/vnd.fujitsu.oasys2': return true;// oa2
-			case 'application/vnd.fujitsu.oasys3': return true;// oa3
-			case 'application/vnd.fujitsu.oasysgp': return true;// fg5
-			case 'application/vnd.fujitsu.oasysprs': return true;// bh2
-			case 'application/vnd.fujixerox.ddd': return true;// ddd
-			case 'application/vnd.fujixerox.docuworks': return true;// xdw
-			case 'application/vnd.fujixerox.docuworks.binder': return true;// xbd
-			case 'application/vnd.fuzzysheet': return true;// fzs
-			case 'application/vnd.genomatix.tuxedo': return true;// txd
-			case 'application/vnd.geogebra.file': return true;// ggb
-			case 'application/vnd.geogebra.tool': return true;// ggt
-			case 'application/vnd.geometry-explorer': return true;// gex gre
-			case 'application/vnd.geonext': return true;// gxt
-			case 'application/vnd.geoplan': return true;// g2w
-			case 'application/vnd.geospace': return true;// g3w
-			case 'application/vnd.gmx': return true;// gmx
-			case 'application/vnd.google-earth.kml+xml': return true;// kml
-			case 'application/vnd.google-earth.kmz': return true;// kmz
-			case 'application/vnd.grafeq': return true;// gqf gqs
-			case 'application/vnd.groove-account': return true;// gac
-			case 'application/vnd.groove-help': return true;// ghf
-			case 'application/vnd.groove-identity-message': return true;// gim
-			case 'application/vnd.groove-injector': return true;// grv
-			case 'application/vnd.groove-tool-message': return true;// gtm
-			case 'application/vnd.groove-tool-template': return true;// tpl
-			case 'application/vnd.groove-vcard': return true;// vcg
-			case 'application/vnd.hal+xml': return true;// hal
-			case 'application/vnd.handheld-entertainment+xml': return true;// zmm
-			case 'application/vnd.hbci': return true;// hbci
-			case 'application/vnd.hhe.lesson-player': return true;// les
-			case 'application/vnd.hp-hpgl': return true;// hpgl
-			case 'application/vnd.hp-hpid': return true;// hpid
-			case 'application/vnd.hp-hps': return true;// hps
-			case 'application/vnd.hp-jlyt': return true;// jlt
-			case 'application/vnd.hp-pcl': return true;// pcl
-			case 'application/vnd.hp-pclxl': return true;// pclxl
-			case 'application/vnd.hydrostatix.sof-data': return true;// sfd- hdstx
-			case 'application/vnd.ibm.minipay': return true;// mpy
-			case 'application/vnd.ibm.modcap': return true;// afp listafp list3820
-			case 'application/vnd.ibm.rights-management': return true;// irm
-			case 'application/vnd.ibm.secure-container': return true;// sc
-			case 'application/vnd.iccprofile': return true;// icc icm
-			case 'application/vnd.igloader': return true;// igl
-			case 'application/vnd.immervision-ivp': return true;// ivp
-			case 'application/vnd.immervision-ivu': return true;// ivu
-			case 'application/vnd.insors.igm': return true;// igm
-			case 'application/vnd.intercon.formnet': return true;// xpw xpx
-			case 'application/vnd.intergeo': return true;// i2g
-			case 'application/vnd.intu.qbo': return true;// qbo
-			case 'application/vnd.intu.qfx': return true;// qfx
-			case 'application/vnd.ipunplugged.rcprofile': return true;// rcprofile
-			case 'application/vnd.irepository.package+xml': return true;// irp
-			case 'application/vnd.is-xpr': return true;// xpr
-			case 'application/vnd.isac.fcs': return true;// fcs
-			case 'application/vnd.jam': return true;// jam
-			case 'application/vnd.jcp.javame.midlet-rms': return true;// rms
-			case 'application/vnd.jisp': return true;// jisp
-			case 'application/vnd.joost.joda-archive': return true;// joda
-			case 'application/vnd.kahootz': return true;// ktz ktr
-			case 'application/vnd.kde.karbon': return true;// karbon
-			case 'application/vnd.kde.kchart': return true;// chrt
-			case 'application/vnd.kde.kformula': return true;// kfo
-			case 'application/vnd.kde.kivio': return true;// flw
-			case 'application/vnd.kde.kontour': return true;// kon
-			case 'application/vnd.kde.kpresenter': return true;// kpr kpt
-			case 'application/vnd.kde.kspread': return true;// ksp
-			case 'application/vnd.kde.kword': return true;// kwd kwt
-			case 'application/vnd.kenameaapp': return true;// htke
-			case 'application/vnd.kidspiration': return true;// kia
-			case 'application/vnd.kinar': return true;// kne knp
-			case 'application/vnd.koan': return true;// skp skd skt skm
-			case 'application/vnd.kodak-descriptor': return true;// sse
-			case 'application/vnd.las.las+xml': return true;// lasxml
-			case 'application/vnd.llamagraphics.life-balance.desktop': return true;// lbd
-			case 'application/vnd.llamagraphics.life-balance.exchange+xml': return true;// lbe
-			case 'application/vnd.lotus-1-2-3': return true;// 123
-			case 'application/vnd.lotus-approach': return true;// apr
-			case 'application/vnd.lotus-freelance': return true;// pre
-			case 'application/vnd.lotus-notes': return true;// nsf
-			case 'application/vnd.lotus-organizer': return true;// org
-			case 'application/vnd.lotus-screencam': return true;// scm
-			case 'application/vnd.lotus-wordpro': return true;// lwp
-			case 'application/vnd.macports.portpkg': return true;// portpkg
-			case 'application/vnd.mcd': return true;// mcd
-			case 'application/vnd.medcalcdata': return true;// mc1
-			case 'application/vnd.mediastation.cdkey': return true;// cdkey
-			case 'application/vnd.mfer': return true;// mwf
-			case 'application/vnd.mfmp': return true;// mfm
-			case 'application/vnd.micrografx.flo': return true;// flo
-			case 'application/vnd.micrografx.igx': return true;// igx
-			case 'application/vnd.mif': return true;// mif
-			case 'application/vnd.mobius.daf': return true;// daf
-			case 'application/vnd.mobius.dis': return true;// dis
-			case 'application/vnd.mobius.mbk': return true;// mbk
-			case 'application/vnd.mobius.mqy': return true;// mqy
-			case 'application/vnd.mobius.msl': return true;// msl
-			case 'application/vnd.mobius.plc': return true;// plc
-			case 'application/vnd.mobius.txf': return true;// txf
-			case 'application/vnd.mophun.application': return true;// mpn
-			case 'application/vnd.mophun.certificate': return true;// mpc
-			case 'application/vnd.mozilla.xul+xml': return true;// xul
-			case 'application/vnd.ms-artgalry': return true;// cil
-			case 'application/vnd.ms-cab-compressed': return true;// cab
-			case 'application/vnd.ms-excel': return true;// xls xlm xla xlc xlt xlw
-			case 'application/vnd.ms-excel.addin.macroenabled.12': return true;// xlam
-			case 'application/vnd.ms-excel.sheet.binary.macroenabled.12': return true;// xlsb
-			case 'application/vnd.ms-excel.sheet.macroenabled.12': return true;// xlsm
-			case 'application/vnd.ms-excel.template.macroenabled.12': return true;// xltm
-			case 'application/vnd.ms-fontobject': return true;// eot
-			case 'application/vnd.ms-htmlhelp': return true;// chm
-			case 'application/vnd.ms-ims': return true;// ims
-			case 'application/vnd.ms-lrm': return true;// lrm
-			case 'application/vnd.ms-office': return true;// theme thmx
-			case 'application/vnd.ms-pki.seccat': return true;// cat
-			case 'application/vnd.ms-pki.stl': return true;// stl
-			case 'application/vnd.ms-powerpoint': return true;// ppt pps pot
-			case 'application/vnd.ms-powerpoint.addin.macroenabled.12': return true;// ppam
-			case 'application/vnd.ms-powerpoint.presentation.macroenabled.12': return true;// pptm
-			case 'application/vnd.ms-powerpoint.slide.macroenabled.12': return true;// sldm
-			case 'application/vnd.ms-powerpoint.slideshow.macroenabled.12': return true;// ppsm
-			case 'application/vnd.ms-powerpoint.template.macroenabled.12': return true;// potm
-			case 'application/vnd.ms-project': return true;// mpp mpt
-			case 'application/vnd.ms-word.document.macroenabled.12': return true;// docm
-			case 'application/vnd.ms-word.template.macroenabled.12': return true;// dotm
-			case 'application/vnd.ms-works': return true;// wps wks wcm wdb
-			case 'application/vnd.ms-wpl': return true;// wpl
-			case 'application/vnd.ms-xpsdocument': return true;// xps
-			case 'application/vnd.mseq': return true;// mseq
-			case 'application/vnd.musician': return true;// mus
-			case 'application/vnd.muvee.style': return true;// msty
-			case 'application/vnd.mynfc': return true;// taglet
-			case 'application/vnd.neurolanguage.nlu': return true;// nlu
-			case 'application/vnd.nitf': return true;// ntf nitf
-			case 'application/vnd.noblenet-directory': return true;// nnd
-			case 'application/vnd.noblenet-sealer': return true;// nns
-			case 'application/vnd.noblenet-web': return true;// nnw
-			case 'application/vnd.nokia.n-gage.data': return true;// ngdat
-			case 'application/vnd.nokia.n-gage.symbian.install': return true;// n- gage
-			case 'application/vnd.nokia.radio-preset': return true;// rpst
-			case 'application/vnd.nokia.radio-presets': return true;// rpss
-			case 'application/vnd.novadigm.edm': return true;// edm
-			case 'application/vnd.novadigm.edx': return true;// edx
-			case 'application/vnd.novadigm.ext': return true;// ext
-			case 'application/vnd.oasis.opendocument.chart': return true;// odc
-			case 'application/vnd.oasis.opendocument.chart-template': return true;// otc
-			case 'application/vnd.oasis.opendocument.database': return true;// odb
-			case 'application/vnd.oasis.opendocument.formula': return true;// odf
-			case 'application/vnd.oasis.opendocument.formula-template': return true;// odft
-			case 'application/vnd.oasis.opendocument.graphics': return true;// odg
-			case 'application/vnd.oasis.opendocument.graphics-template': return true;// otg
-			case 'application/vnd.oasis.opendocument.image': return true;// odi
-			case 'application/vnd.oasis.opendocument.image-template': return true;// oti
-			case 'application/vnd.oasis.opendocument.presentation': return true;// odp
-			case 'application/vnd.oasis.opendocument.presentation-template': return true;// otp
-			case 'application/vnd.oasis.opendocument.spreadsheet': return true;// ods
-			case 'application/vnd.oasis.opendocument.spreadsheet-template': return true;// ots
-			case 'application/vnd.oasis.opendocument.text': return true;// odt
-			case 'application/vnd.oasis.opendocument.text-master': return true;// odm
-			case 'application/vnd.oasis.opendocument.text-template': return true;// ott
-			case 'application/vnd.oasis.opendocument.text-web': return true;// oth
-			case 'application/vnd.olpc-sugar': return true;// xo
-			case 'application/vnd.oma.dd2+xml': return true;// dd2
-			case 'application/vnd.openofficeorg.extension': return true;// oxt
-			case 'application/vnd.openxmlformats-officedocument.presentationml.presentation': return true;// pptx
-			case 'application/vnd.openxmlformats-officedocument.presentationml.slide': return true;// sldx
-			case 'application/vnd.openxmlformats-officedocument.presentationml.slideshow': return true;// ppsx
-			case 'application/vnd.openxmlformats-officedocument.presentationml.template': return true;// potx
-			case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': return true;// xlsx
-			case 'application/vnd.openxmlformats-officedocument.spreadsheetml.template': return true;// xltx
-			case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': return true;// docx
-			case 'application/vnd.openxmlformats-officedocument.wordprocessingml.template': return true;// dotx
-			case 'application/vnd.osgeo.mapguide.package': return true;// mgp
-			case 'application/vnd.osgi.dp': return true;// dp
-			case 'application/vnd.osgi.subsystem': return true;// esa
-			case 'application/vnd.palm': return true;// pdb pqa oprc
-			case 'application/vnd.pawaafile': return true;// paw
-			case 'application/vnd.pg.format': return true;// str
-			case 'application/vnd.pg.osasli': return true;// ei6
-			case 'application/vnd.picsel': return true;// efif
-			case 'application/vnd.pmi.widget': return true;// wg
-			case 'application/vnd.pocketlearn': return true;// plf
-			case 'application/vnd.powerbuilder6': return true;// pbd
-			case 'application/vnd.previewsystems.box': return true;// box
-			case 'application/vnd.proteus.magazine': return true;// mgz
-			case 'application/vnd.publishare-delta-tree': return true;// qps
-			case 'application/vnd.pvi.ptid1': return true;// ptid
-			case 'application/vnd.quark.quarkxpress': return true;// qxd qxt qwd qwt qxl qxb
-			case 'application/vnd.realvnc.bed': return true;// bed
-			case 'application/vnd.recordare.musicxml': return true;// mxl
-			case 'application/vnd.recordare.musicxml+xml': return true;// musicxml
-			case 'application/vnd.rig.cryptonote': return true;// cryptonote
-			case 'application/vnd.rim.cod': return true;// cod
-			case 'application/vnd.rn-realmedia': return true;// rm
-			case 'application/vnd.rn-realmedia-vbr': return true;// rmvb
-			case 'application/vnd.route66.link66+xml': return true;// link66
-			case 'application/vnd.sailingtracker.track': return true;// st
-			case 'application/vnd.seemail': return true;// see
-			case 'application/vnd.sema': return true;// sema
-			case 'application/vnd.semd': return true;// semd
-			case 'application/vnd.semf': return true;// semf
-			case 'application/vnd.shana.informed.formdata': return true;// ifm
-			case 'application/vnd.shana.informed.formtemplate': return true;// itp
-			case 'application/vnd.shana.informed.interchange': return true;// iif
-			case 'application/vnd.shana.informed.package': return true;// ipk
-			case 'application/vnd.simtech-mindmapper': return true;// twd twds
-			case 'application/vnd.smaf': return true;// mmf
-			case 'application/vnd.smart.teacher': return true;// teacher
-			case 'application/vnd.solent.sdkm+xml': return true;// sdkm sdkd
-			case 'application/vnd.spotfire.dxp': return true;// dxp
-			case 'application/vnd.spotfire.sfs': return true;// sfs
-			case 'application/vnd.stardivision.calc': return true;// sdc
-			case 'application/vnd.stardivision.draw': return true;// sda
-			case 'application/vnd.stardivision.impress': return true;// sdd
-			case 'application/vnd.stardivision.math': return true;// smf
-			case 'application/vnd.stardivision.writer': return true;// sdw vor
-			case 'application/vnd.stardivision.writer-global': return true;// sgl
-			case 'application/vnd.stepmania.package': return true;// smzip
-			case 'application/vnd.stepmania.stepchart': return true;// sm
-			case 'application/vnd.sun.xml.calc': return true;// sxc
-			case 'application/vnd.sun.xml.calc.template': return true;// stc
-			case 'application/vnd.sun.xml.draw': return true;// sxd
-			case 'application/vnd.sun.xml.draw.template': return true;// std
-			case 'application/vnd.sun.xml.impress': return true;// sxi
-			case 'application/vnd.sun.xml.impress.template': return true;// sti
-			case 'application/vnd.sun.xml.math': return true;// sxm
-			case 'application/vnd.sun.xml.writer': return true;// sxw
-			case 'application/vnd.sun.xml.writer.global': return true;// sxg
-			case 'application/vnd.sun.xml.writer.template': return true;// stw
-			case 'application/vnd.sus-calendar': return true;// sus susp
-			case 'application/vnd.svd': return true;// svd
-			case 'application/vnd.symbian.install			sis': return true;// sisx
-			case 'application/vnd.syncml+xml': return true;// xsm
-			case 'application/vnd.syncml.dm+wbxml': return true;// bdm
-			case 'application/vnd.syncml.dm+xml': return true;// xdm
-			case 'application/vnd.tao.intent-module-archive': return true;// tao
-			case 'application/vnd.tcpdump.pcap': return true;// pcap cap dmp
-			case 'application/vnd.tmobile-livetv': return true;// tmo
-			case 'application/vnd.trid.tpt': return true;// tpt
-			case 'application/vnd.triscape.mxs': return true;// mxs
-			case 'application/vnd.trueapp': return true;// tra
-			case 'application/vnd.ufdl': return true;// ufd ufdl
-			case 'application/vnd.uiq.theme': return true;// utz
-			case 'application/vnd.umajin': return true;// umj
-			case 'application/vnd.unity': return true;// unityweb
-			case 'application/vnd.uoml+xml': return true;// uoml
-			case 'application/vnd.vcx': return true;// vcx
-			case 'application/vnd.visio': return true;// vsd vst vss vsw
-			case 'application/vnd.visionary': return true;// vis
-			case 'application/vnd.vsf': return true;// vsf
-			case 'application/vnd.wap.wbxml': return true;// wbxml
-			case 'application/vnd.wap.wmlc': return true;// wmlc
-			case 'application/vnd.wap.wmlscriptc': return true;// wmlsc
-			case 'application/vnd.webturbo': return true;// wtb
-			case 'application/vnd.wolfram.player': return true;// nbp
-			case 'application/vnd.wordperfect': return true;// wpd
-			case 'application/vnd.wqd': return true;// wqd
-			case 'application/vnd.wt.stf': return true;// stf
-			case 'application/vnd.xara': return true;// xar
-			case 'application/vnd.xfdl': return true;// xfdl
-			case 'application/vnd.yamaha.hv-dic': return true;// hvd
-			case 'application/vnd.yamaha.hv-script': return true;// hvs
-			case 'application/vnd.yamaha.hv-voice': return true;// hvp
-			case 'application/vnd.yamaha.openscoreformat': return true;// osf
-			case 'application/vnd.yamaha.openscoreformat.osfpvg+xml': return true;// osfpvg
-			case 'application/vnd.yamaha.smaf-audio': return true;// saf
-			case 'application/vnd.yamaha.smaf-phrase': return true;// spf
-			case 'application/vnd.yellowriver-custom-menu': return true;// cmp
-			case 'application/vnd.zul': return true;// zir zirz
-			case 'application/vnd.zzazz.deck+xml': return true;// zaz
-			case 'application/voicexml+xml': return true;// vxml
-			case 'application/widget': return true;// wgt
-			case 'application/winhlp': return true;// hlp
-			case 'application/wsdl+xml': return true;// wsdl
-			case 'application/wspolicy+xml': return true;// wspolicy
-			case 'application/x-7z-compressed': return true;// 7z
-			case 'application/x-abiword': return true;// abw
-			case 'application/x-ace-compressed': return true;// ace
-			case 'application/x-apple-diskimage': return true;// dmg
-			case 'application/x-authorware-bin': return true;// aab x32 u32 vox
-			case 'application/x-authorware-map': return true;// aam
-			case 'application/x-authorware-seg': return true;// aas
-			case 'application/x-archive': return true;// ADMIN_USERS//5027.Pawel_Kamola/projekty/grafy_projekt_python/grafy/numpy/core/lib/libnpymath.a
-			case 'application/x-empty': return false;// empty files
-			case 'application/x-bcpio': return true;// bcpio
-			case 'application/x-bittorrent': return true;// torrent
-			case 'application/x-blorb': return true;// blb blorb
-			case 'application/x-bzip': return true;// bz
-			case 'application/x-bzip2': return true;// bz2 boz
-			case 'application/x-cbr': return true;// cbr cba cbt cbz cb7
-			case 'application/x-cdlink': return true;// vcd
-			case 'application/x-cfs-compressed': return true;// cfs
-			case 'application/x-chat': return true;// chat
-			case 'application/x-chess-pgn': return true;// pgn
-			case 'application/x-conference': return true;// nsc
-			case 'application/x-cpio': return true;// cpio
-			case 'application/x-csh': return true;// csh
-			case 'application/x-debian-package': return true;// deb udeb
-			case 'application/x-dgc-compressed': return true;// dgc
-			case 'application/x-director': return true;// dir dcr dxr cst cct cxt w3d fgd swa
-			case 'application/x-doom': return true;// wad
-			case 'application/x-dtbncx+xml': return true;// ncx
-			case 'application/x-dtbook+xml': return true;// dtb
-			case 'application/x-dtbresource+xml': return true;// res
-			case 'application/x-dvi': return true;// dvi
-			case 'application/x-envoy': return true;// evy
-			case 'application/x-eva': return true;// eva
-			case 'application/x-font-bdf': return true;// bdf
-			case 'application/x-font-ghostscript': return true;// gsf
-			case 'application/x-font-linux-psf': return true;// psf
-			case 'application/x-font-otf': return true;// otf
-			case 'application/x-font-pcf': return true;// pcf
-			case 'application/x-font-snf': return true;// snf
-			case 'application/x-font-ttf': return true;// ttc ttf
-			case 'application/x-font-type1': return true;// afm pfa pfb pfm
-			case 'application/x-freearc': return true;// arc
-			case 'application/x-futuresplash': return true;// spl
-			case 'application/x-executable': return true;//
-			case 'application/x-gca-compressed': return true;// gca
-			case 'application/x-glulx': return true;// ulx
-			case 'application/x-gnumeric': return true;// gnumeric
-			case 'application/x-gramps-xml': return true;// gramps
-			case 'application/x-gtar': return true;// gtar
-			case 'application/x-gzip': return true;// gz gzip
-			case 'application/x-hdf': return true;// hdf
-			case 'application/x-install-instructions': return true;// install
-			case 'application/x-iso9660-image': return true;// iso
-			case 'application/x-java-jnlp-file': return true;// jnlp
-			case 'application/x-latex': return true;// latex
-			case 'application/x-lzh-compressed': return true;// lha lzh
-			case 'application/x-mie': return true;// mie
-			case 'application/x-mobipocket-ebook': return true;// mobi prc
-			case 'application/x-ms-application': return true;// application
-			case 'application/x-ms-shortcut': return true;// lnk
-			case 'application/x-ms-wmd': return true;// wmd
-			case 'application/x-ms-wmz': return true;// wmz
-			case 'application/x-ms-xbap': return true;// xbap
-			case 'application/x-msaccess': return true;// mdb
-			case 'application/x-msbinder': return true;// obd
-			case 'application/x-mscardfile': return true;// crd
-			case 'application/x-msclip': return true;// clp
-			case 'application/x-msdownload': return true;// msi exe dll com bat
-			case 'application/x-msmediaview': return true;// m14 mvb m13
-			case 'application/x-msmetafile': return true;// emz wmf wmz emf
-			case 'application/x-msmoney': return true;// mny
-			case 'application/x-mspublisher': return true;// pub
-			case 'application/x-msschedule': return true;// scd
-			case 'application/x-msterminal': return true;// trm
-			case 'application/x-mswrite': return true;// wri
-			case 'application/x-netcdf': return true;// cdf nc
-			case 'application/x-nzb': return true;// nzb
-			case 'application/x-pkcs12': return true;// pfx p12
-			case 'application/x-pkcs7-certificates': return true;// spc p7b
-			case 'application/x-pkcs7-certreqresp': return true;// p7r
-			case 'application/x-rar': return true;// rar
-			case 'application/x-rar-compressed': return true;// rar
-			case 'application/x-research-info-systems': return true;// ris
-			case 'application/x-sh': return true;// sh
-			case 'application/x-shar': return true;// shar
-			case 'application/x-shockwave-flash': return true;// swf
-			case 'application/x-silverlight-app': return true;// xap
-			case 'application/x-sql': return true;// sql
-			case 'application/x-stuffit': return true;// sit
-			case 'application/x-stuffitx': return true;// sitx
-			case 'application/x-subrip': return true;// srt
-			case 'application/x-sv4cpio': return true;// sv4cpio
-			case 'application/x-sv4crc': return true;// sv4crc
-			case 'application/x-t3vm-image': return true;// t3
-			case 'application/x-tads': return true;// gam
-			case 'application/x-tar': return true;// tar
-			case 'application/x-tcl': return true;// tcl
-			case 'application/x-tex': return true;// tex
-			case 'application/x-tex-tfm': return true;// tfm
-			case 'application/x-texinfo': return true;// texi texinfo
-			case 'application/x-tgif': return true;// obj
-			case 'application/x-ustar': return true;// ustar
-			case 'application/x-wais-source': return true;// src
-			case 'application/x-x509-ca-cert': return true;// crt der
-			case 'application/x-xfig': return true;// fig
-			case 'application/x-xliff+xml': return true;// xlf
-			case 'application/x-xpinstall': return true;// xpi
-			case 'application/x-xz': return true;// xz
-			case 'application/x-zmachine': return true;// z8 z1 z2 z3 z4 z5 z6 z7
-			case 'application/xaml+xml': return true;// xaml
-			case 'application/xcap-diff+xml': return true;// xdf
-			case 'application/xenc+xml': return true;// xenc
-			case 'application/xhtml+xml': return true;// xht xhtml
-			case 'application/xml': return true;// xsl xml
-			case 'application/xml-dtd': return true;// dtd
-			case 'application/xop+xml': return true;// xop
-			case 'application/xproc+xml': return true;// xpl
-			case 'application/xslt+xml': return true;// xslt
-			case 'application/xspf+xml': return true;// xspf
-			case 'application/xv+xml': return true;// xvm mxml xhvml xvml
-			case 'application/yang': return true;// yang
-			case 'application/yin+xml': return true;// yin
-			case 'application/zip': return true;// zip
-			case 'audio/adpcm': return true;// adp
-			case 'audio/basic': return true;// snd au
-			case 'audio/midi': return true;// rmi mid midi kar
-			case 'audio/mp4': return true;// mp4a m4a
-			case 'audio/mpeg': return true;// m3a mpga mp2 mp2a mp3 m2a
-			case 'audio/ogg': return true;// spx oga ogg
-			case 'audio/s3m': return true;// s3m
-			case 'audio/silk': return true;// sil
-			case 'audio/vnd.dece.audio': return true;// uvva uva
-			case 'audio/vnd.digital-winds': return true;// eol
-			case 'audio/vnd.dra': return true;// dra
-			case 'audio/vnd.dts': return true;// dts
-			case 'audio/vnd.dts.hd': return true;// dtshd
-			case 'audio/vnd.lucent.voice': return true;// lvp
-			case 'audio/vnd.ms-playready.media.pya': return true;// pya
-			case 'audio/vnd.nuera.ecelp4800': return true;// ecelp4800
-			case 'audio/vnd.nuera.ecelp7470': return true;// ecelp7470
-			case 'audio/vnd.nuera.ecelp9600': return true;// ecelp9600
-			case 'audio/vnd.rip': return true;// rip
-			case 'audio/webm': return true;// weba
-			case 'audio/x-aac': return true;// aac
-			case 'audio/x-aiff': return true;// aifc aif aiff
-			case 'audio/x-caf': return true;// caf
-			case 'audio/x-flac': return true;// flac
-			case 'audio/x-matroska': return true;// mka
-			case 'audio/x-mpegurl': return true;// m3u
-			case 'audio/x-ms-wax': return true;// wax
-			case 'audio/x-ms-wma': return true;// wma
-			case 'audio/x-pn-realaudio': return true;// ra ram
-			case 'audio/x-pn-realaudio-plugin': return true;// rmp
-			case 'audio/x-wav': return true;// wav
-			case 'audio/xm': return true;// xm
-			case 'chemical/x-cdx': return true;// cdx
-			case 'chemical/x-cif': return true;// cif
-			case 'chemical/x-cmdf': return true;// cmdf
-			case 'chemical/x-cml': return true;// cml
-			case 'chemical/x-csml': return true;// csml
-			case 'chemical/x-xyz': return true;// xyz
-			case 'image/bmp': return true;// bmp
-			case 'image/cgm': return true;// cgm
-			case 'image/g3fax': return true;// g3
-			case 'image/gif': return true;// gif
-			case 'image/ief': return true;// ief
-			case 'image/jpeg': return true;// jpe jpeg jpg
-			case 'image/ktx': return true;// ktx
-			case 'image/png': return true;// png
-			case 'image/prs.btif': return true;// btif
-			case 'image/sgi': return true;// sgi
-			case 'image/svg+xml': return true;// svgz svg
-			case 'image/tiff': return true;// tif tiff
-			case 'image/vnd.adobe.photoshop': return true;// psd
-			case 'image/vnd.dece.graphic': return true;// uvvg uvi uvvi uvg
-			case 'image/vnd.djvu': return true;// djv djvu
-			case 'image/vnd.dvb.subtitle': return true;// sub
-			case 'image/vnd.dwg': return true;// dwg
-			case 'image/vnd.dxf': return true;// dxf
-			case 'image/vnd.fastbidsheet': return true;// fbs
-			case 'image/vnd.fpx': return true;// fpx
-			case 'image/vnd.fst': return true;// fst
-			case 'image/vnd.fujixerox.edmics-mmr': return true;// mmr
-			case 'image/vnd.fujixerox.edmics-rlc': return true;// rlc
-			case 'image/vnd.ms-modi': return true;// mdi
-			case 'image/vnd.ms-photo': return true;// wdp
-			case 'image/vnd.net-fpx': return true;// npx
-			case 'image/vnd.wap.wbmp': return true;// wbmp
-			case 'image/vnd.xiff': return true;// xif
-			case 'image/webp': return true;// webp
-			case 'image/x-3ds': return true;// 3ds
-			case 'image/x-cmu-raster': return true;// ras
-			case 'image/x-cmx': return true;// cmx
-			case 'image/x-freehand': return true;// fh7 fh fhc fh4 fh5
-			case 'image/x-ico': return true;// ico
-			case 'image/x-icon': return true;// ico
-			case 'image/x-mrsid-image': return true;// sid
-			case 'image/x-ms-bmp': return true;// bmp
-			case 'image/x-pcx': return true;// pcx
-			case 'image/x-pict': return true;// pct pic
-			case 'image/x-portable-anymap': return true;// pnm
-			case 'image/x-portable-bitmap': return true;// pbm
-			case 'image/x-portable-graymap': return true;// pgm
-			case 'image/x-portable-greymap': return true;// pgm
-			case 'image/x-portable-pixmap': return true;// ppm
-			case 'image/x-rgb': return true;// rgb
-			case 'image/x-tga': return true;// tga
-			case 'image/x-xbitmap': return true;// xbm
-			case 'image/x-xpixmap': return true;// xpm
-			case 'image/x-xwindowdump': return true;// xwd
-			case 'message/rfc822': return true;// mime eml
-			case 'model/iges': return true;// iges igs
-			case 'model/mesh': return true;// silo msh mesh
-			case 'model/vnd.collada+xml': return true;// dae
-			case 'model/vnd.dwf': return true;// dwf
-			case 'model/vnd.gdl': return true;// gdl
-			case 'model/vnd.gtw': return true;// gtw
-			case 'model/vnd.mts': return true;// mts
-			case 'model/vnd.vtu': return true;// vtu
-			case 'model/vrml': return true;// vrml wrl
-			case 'model/x3d+binary': return true;// x3dbz x3db
-			case 'model/x3d+vrml': return true;// x3dvz x3dv
-			case 'model/x3d+xml': return true;// x3dz x3d
-			case 'text/cache-manifest': return true;// appcache
-			case 'text/calendar': return true;// ifb ics
-			case 'text/css': return true;// css
-			case 'text/csv': return true;// csv
-			case 'text/html': return true;// htm html
-			case 'text/n3': return true;// n3
-			case 'text/plain': return true;// in txt text conf def list log
-			case 'text/prs.lines.tag': return true;// dsc
-			case 'text/rtf': return true;// rtf
-			case 'text/richtext': return true;// rtx
-			case 'text/sgml': return true;// sgm sgml
-			case 'text/tab-separated-values': return true;// tsv
-			case 'text/troff': return true;// ms t tr roff man me
-			case 'text/turtle': return true;// ttl
-			case 'text/uri-list': return true;// urls uri uris
-			case 'text/vcard': return true;// vcard
-			case 'text/vnd.curl': return true;// curl
-			case 'text/vnd.curl.dcurl': return true;// dcurl
-			case 'text/vnd.curl.mcurl': return true;// mcurl
-			case 'text/vnd.curl.scurl': return true;// scurl
-			case 'text/vnd.dvb.subtitle': return true;// sub
-			case 'text/vnd.fly': return true;// fly
-			case 'text/vnd.fmi.flexstor': return true;// flx
-			case 'text/vnd.graphviz': return true;// gv
-			case 'text/vnd.in3d.3dml': return true;// 3dml
-			case 'text/vnd.in3d.spot': return true;// spot
-			case 'text/vnd.sun.j2me.app-descriptor': return true;// jad
-			case 'text/vnd.wap.wml': return true;// wml
-			case 'text/vnd.wap.wmlscript': return true;// wmls
-			case 'text/x-asm': return true;// s asm
-			case 'text/x-c': return true;// c cc cxx cpp h hh dic
-			case 'text/x-c++': return true;// c++
-			case 'text/x-fortran': return true;// f for f77 f90
-			case 'text/x-java': return true;// java
-			case 'text/x-java-source': return true;// java
-			case 'text/x-makefile': return true;// Makefile
-			case 'text/x-nfo': return true;// nfo
-			case 'text/x-opml': return true;// opml
-			case 'text/x-pascal': return true;// p pas
-			case 'text/x-php': return true;// php
-			case 'text/x-python': return true;// py
-			case 'text/x-setext': return true;// etx
-			case 'text/x-sfv': return true;// sfv
-			case 'text/x-shellscript': return true;// ...
-			case 'text/x-uuencode': return true;// uu
-			case 'text/x-vcalendar': return true;// vcs
-			case 'text/x-vcard': return true;// vcf
-			case 'video/3gpp': return true;// 3gp
-			case 'video/3gpp2': return true;// 3g2
-			case 'video/h261': return true;// h261
-			case 'video/h263': return true;// h263
-			case 'video/h264': return true;// h264
-			case 'video/jpeg': return true;// jpgv
-			case 'video/jpm': return true;// jpm jpgm
-			case 'video/mj2': return true;// mjp2 mj2
-			case 'video/mp4': return true;// mpg4 mp4 mp4v
-			case 'video/mpeg': return true;// m2v mpeg mpg mpe m1v
-			case 'video/ogg': return true;// ogv
-			case 'video/quicktime': return true;// mov qt
-			case 'video/vnd.dece.hd': return true;// uvvh uvh
-			case 'video/vnd.dece.mobile': return true;// uvvm uvm
-			case 'video/vnd.dece.pd': return true;// uvvp uvp
-			case 'video/vnd.dece.sd': return true;// uvvs uvs
-			case 'video/vnd.dece.video': return true;// uvvv uvv
-			case 'video/vnd.dvb.file': return true;// dvb
-			case 'video/vnd.fvt': return true;// fvt
-			case 'video/vnd.mpegurl': return true;// m4u mxu
-			case 'video/vnd.ms-playready.media.pyv': return true;// pyv
-			case 'video/vnd.uvvu.mp4': return true;// uvvu uvu
-			case 'video/vnd.vivo': return true;// viv
-			case 'video/webm': return true;// webm
-			case 'video/x-f4v': return true;// f4v
-			case 'video/x-fli': return true;// fli
-			case 'video/x-flv': return true;// flv
-			case 'video/x-m4v': return true;// m4v
-			case 'video/x-matroska': return true;// mks mkv mk3d
-			case 'video/x-mng': return true;// mng
-			case 'video/x-ms-asf': return true;// asx asf
-			case 'video/x-ms-vob': return true;// vob
-			case 'video/x-ms-wm': return true;// wm
-			case 'video/x-ms-wmv': return true;// wmv
-			case 'video/x-ms-wmx': return true;// wmx
-			case 'video/x-ms-wvx': return true;// wvx
-			case 'video/x-msvideo': return true;// avi
-			case 'video/x-sgi-movie': return true;// movie
-			case 'video/x-smv': return true;// smv
-			case 'x-conference/x-cooltalk': return true;// ice
-		}
-		return false;
-	}
-
 }