<?php
/*
--------------------------
Класс для работы с файлами
--------------------------
*/
CLASS FILE{
/*
---------------------------------------
Загрузка файла
---------------------------------------
*/
PUBLIC STATIC FUNCTION UPLOAD($path, $name = 'Выберите файл', $form = 1, $class = 'file-upload', $icon = 'upload') {
GLOBAL $user;
//$path - путь обращения к обработчику
//$name - описание выгрузки
//$form - использование собственной формы отправки
//$class - стиль кнопки
//$icon - иконка кнопки
?>
<? IF ($form == 1){ ?>
<form id="js-form" method="post" enctype="multipart/form-data">
<? } ?>
<label class='file-label'><span class="<?=$class?>">
<input id="js-file" type="file" name="file" class="file-form" multiple>
<span><i class="fa fa-<?=$icon?> fa-fw"></i> <?=TEXT_ABSOLUTE(LG($name))?></span>
</span></label>
<? IF ($form == 1){ ?>
</form>
<? } ?>
<div id="result"></div>
<script>
$('#js-file').change(function() {
$('#js-form').ajaxSubmit({
xhr: function() {
var xhr = new window.XMLHttpRequest();
xhr.upload.addEventListener("progress", function(evt) {
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
percentComplete = parseInt(percentComplete * 100);
var data_progress = "<div class='file-upload-progress'><i class='fa fa-spinner fa-pulse fa-lg fa-fw'></i> <b>Загрузка...</b><br /><br /><div class='file-upload-progress-ind-o'><div class='file-upload-progress-ind' style='width:"+percentComplete+"%;'><span class='file-upload-progress-pr'>"+percentComplete+"%</span></div></div></div>";
$('#result').html(data_progress);
if (percentComplete === 100) {
$('#result').html("<div class='file-upload-progress'><font color='#4BBB62'><i class='fa fa-check fa-lg fa-fw'></i> <b>Успешно загружено</b></font><br /><br /><div class='file-upload-progress-ind-o'><div class='file-upload-progress-ind-green' style='width:100%;'><span class='file-upload-progress-pr'>100%</span></div></div></div>");
}
}
}, false);
return xhr;
},
type: "POST",
url: "<?=$path?>",
target: "#result",
success: function() {
// После загрузки файла очистим форму
$('#js-form')[0].reset();
},
error: function() {
$('#result').html("<div class='file-upload-progress'><i class='fa fa-exclamation-triangle fa-fw'></i> Ошибка. Попробуйте ещё раз или проверьте подключение и интернету</div>");
}
});
});
</script>
<?
}
/*
-------------------------------------------
Функция отдачи файла на просмотр/скачивание
-------------------------------------------
*/
PUBLIC STATIC FUNCTION DOWNLOAD($filename, $name, $mimetype='application/octet-stream'){
IF (!FILE_EXISTS($filename)){ DIE('Файл не найден'); }
@OB_END_CLEAN();
$from = 0;
$size = FILESIZE($filename);
$to = $size;
IF (ISSET($_SERVER['HTTP_RANGE'])){
IF (PREG_MATCH('#bytes=-([0-9]*)#i', $_SERVER['HTTP_RANGE'], $range)){
$from = $size-$range[1];
$to = $size;
}ELSEIF (PREG_MATCH('#bytes=([0-9]*)-#i', $_SERVER['HTTP_RANGE'], $range)){
$from = $range[1];
$to = $size;
}ELSEIF (PREG_MATCH('#bytes=([0-9]*)-([0-9]*)#i', $_SERVER['HTTP_RANGE'], $range)){
$from = $range[1];
$to = $range[2];
}
HEADER('HTTP/1.1 206 Partial Content');
$cr = 'Content-Range: bytes '.$from .'-'.$to.'/'.$size;
}ELSE{
HEADER('HTTP/1.1 200 Ok');
$etag = MD5($filename);
$etag = SUBSTR($etag, 0, 8) . '-' . SUBSTR($etag, 8, 7) . '-' . SUBSTR($etag, 15, 8);
HEADER('ETag: "'.$etag.'"');
HEADER('Accept-Ranges: bytes');
HEADER('Content-Length: ' .($to-$from));
IF (ISSET($cr)){ HEADER($cr); }
HEADER('Connection: close');
HEADER('Content-Type: ' . $mimetype);
HEADER('Last-Modified: ' . GMDATE('r', FILEMTIME($filename)));
HEADER("Last-Modified: ".GMDATE("D, d M Y H:i:s", FILEMTIME($filename))." GMT");
HEADER("Expires: ".GMDATE("D, d M Y H:i:s", TIME() + 3600)." GMT");
$f = FOPEN($filename, 'rb');
IF (PREG_MATCH('#^image/#i', $mimetype)){
HEADER('Content-Disposition: filename="'.$name.'";');
}ELSE{
HEADER('Content-Disposition: attachment; filename="'.$name.'";');
}
FSEEK($f, $from, SEEK_SET);
$size = $to;
$downloaded = 0;
WHILE(!FEOF($f) && !CONNECTION_STATUS() && ($downloaded < $size)){
$block = MIN(1024 * 8, $size - $downloaded);
ECHO FREAD($f, $block);
$downloaded += $block;
FLUSH();
}
FCLOSE($f);
}
}
/*
---------------------------------------------------
Функция задающая соответствие mime типов расширению
---------------------------------------------------
*/
PUBLIC STATIC FUNCTION MIME($ras = NULL){
IF ($ras == NULL){
RETURN 'application/octet-stream';
}ELSE{
$htaccess = FILE(ROOT.'/.htaccess');
FOR ($i = 0; $i < COUNT($htaccess); $i++){
IF (PREG_MATCH('#^AddType#i', TRIM($htaccess[$i]))){
$type = EXPLODE(' ', TRIM($htaccess[$i]));
$rass = STR_REPLACE('.', NULL, $type[2]);
$mime[$rass] = $type[1];
}
}
IF (ISSET($mime[$ras])){
RETURN $mime[$ras];
}ELSE{
RETURN 'application/octet-stream';
}
}
}
/*
-------------------------------
Функция стиля расширения файла
Автоопределение
-------------------------------
*/
PUBLIC STATIC FUNCTION ICONS($ras = NULL, $data = 'big', $width = 55, $height = 55)
{
//$data - версия иконки которую отдавать. big или small
//$ras - формат файла
$span = "<span style='position: absolute; top: 54%; left: 0; right: 0; text-align: center; transform: translateY(-50%); color: white;'>";
IF ($ras == 'mp4'){
IF ($data == 'big'){
$file = "<div style='display: inline-block; position: relative; background-color: #3EA9FF; width: ".$width."px; height: ".$height."px;'>".$span."<i class='fa fa-film fa-lg fa-fw'></i><br /><small><b>".$ras."</b></small></span></div>";
}ELSEIF ($data == 'small'){
$file = "<i class='fa fa-film fa-fw' style='color: #3EA9FF;'></i>";
}
}ELSEIF ($ras == 'mp3'){
IF ($data == 'big'){
$file = "<div style='display: inline-block; position: relative; background-color: #FF8279; width: ".$width."px; height: ".$height."px;'>".$span."<i class='fa fa-music fa-lg fa-fw'></i><br /><small><b>".$ras."</b></small></span></div>";
}ELSEIF ($data == 'small'){
$file = "<i class='fa fa-music fa-fw' style='color: #FF8279;'></i>";
}
}ELSEIF ($ras == 'png'){
IF ($data == 'big'){
$file = "<div style='display: inline-block; position: relative; background-color: #87AFCF; width: ".$width."px; height: ".$height."px;'>".$span."<i class='fa fa-image fa-lg fa-fw'></i><br /><small><b>".$ras."</b></small></span></div>";
}ELSEIF ($data == 'small'){
$file = "<i class='fa fa-image fa-fw' style='color: #87AFCF;'></i>";
}
}ELSEIF ($ras == 'gif'){
IF ($data == 'big'){
$file = "<div style='display: inline-block; position: relative; background-color: #D38CCD; width: ".$width."px; height: ".$height."px;'>".$span."<i class='fa fa-image fa-lg fa-fw'></i><br /><small><b>".$ras."</b></small></span></div>";
}ELSEIF ($data == 'small'){
$file = "<i class='fa fa-image fa-fw' style='color: #D38CCD;'></i>";
}
}ELSEIF ($ras == 'jpg'){
IF ($data == 'big'){
$file = "<div style='display: inline-block; position: relative; background-color: #70C773; width: ".$width."px; height: ".$height."px;'>".$span."<i class='fa fa-image fa-lg fa-fw'></i><br /><small><b>".$ras."</b></small></span></div>";
}ELSEIF ($data == 'small'){
$file = "<i class='fa fa-image fa-fw' style='color: #70C773;'></i>";
}
}ELSEIF ($ras == 'jpeg'){
IF ($data == 'big'){
$file = "<div style='display: inline-block; position: relative; background-color: #70C773; width: ".$width."px; height: ".$height."px;'>".$span."<i class='fa fa-image fa-lg fa-fw'></i><br /><small><b>".$ras."</b></small></span></div>";
}ELSEIF ($data == 'small'){
$file = "<i class='fa fa-image fa-fw' style='color: #70C773;'></i>";
}
}ELSEIF ($ras == 'zip'){
IF ($data == 'big'){
$file = "<div style='display: inline-block; position: relative; background-color: #F08F00; width: ".$width."px; height: ".$height."px;'>".$span."<i class='fa fa-file-archive-o fa-lg fa-fw'></i><br /><small><b>".$ras."</b></small></span></div>";
}ELSEIF ($data == 'small'){
$file = "<i class='fa fa-file-archive-o fa-fw' style='color: #F08F00;'></i>";
}
}ELSEIF ($ras == 'code'){
IF ($data == 'big'){
$file = "<div style='display: inline-block; position: relative; background-color: #316FB6; width: ".$width."px; height: ".$height."px;'>".$span."<i class='fa fa-code fa-lg fa-fw'></i><br /><small><b>ACMS</b></small></span></div>";
}ELSEIF ($data == 'small'){
$file = "<i class='fa fa-code fa-fw' style='color: #316FB6;'></i>";
}
}ELSEIF ($ras == 'themes'){
IF ($data == 'big'){
$file = "<div style='display: inline-block; position: relative; background-color: #009DAC; width: ".$width."px; height: ".$height."px;'>".$span."<i class='fa fa-object-group fa-lg fa-fw'></i><br /><small><b>".$ras."</b></small></span></div>";
}ELSEIF ($data == 'small'){
$file = "<i class='fa fa-object-group fa-fw' style='color: #009DAC;'></i>";
}
}ELSE{
IF ($data == 'big'){
$file = "<div style='display: inline-block; position: relative; background-color: #D8C200; width: ".$width."px; height: ".$height."px;'>".$span."<i class='fa fa-file fa-lg fa-fw'></i><br /><small><b>file</b></small></span></div>";
}ELSEIF ($data == 'small'){
$file = "<i class='fa fa-file fa-fw' style='color: #D8C200;'></i>";
}
}
RETURN $file;
}
}
?>