Загрузка файлов
Сделал на основе решения загрузки картинок решение, которое позволяет загружать файлы. Все довольно просто.
Создаем файл include/ajax/uploadFile.php и в нем пишем следующее содержимое:
В файле main.js добавляем:
И соответственно в шаблон actions/ActionTopic/add.tpl добавляем:
В файле config.php (строка 40) добавляем:
И еще необходимо создать в папке uploads подпапку files.
Вот и все.
С помощью массива $fileTypes вы можете определить доступные типы файлов.
Надеюсь, что со стилями сами разберетесь, так как у меня шаблоны другие совсем.
Создаем файл include/ajax/uploadFile.php и в нем пишем следующее содержимое:
<?php
/**
* Загрузка файлов
*/
set_include_path(get_include_path().PATH_SEPARATOR.dirname(dirname(dirname(__FILE__))));
chdir(dirname(dirname(dirname(__FILE__))));
require_once("./config/config.ajax.php");
$fileTypes = array("zip", "rar");
$aForm=@$_REQUEST['value'];
$bStateError=true;
$sText='';
if ($oEngine->User_IsAuthorization()) {
$sFile=null;
$oUserCurrent=$oEngine->User_GetUserCurrent();
if (is_uploaded_file($_FILES['usr_file']['tmp_name'])) {
if(!($ext = strtolower(substr($_FILES['usr_file']['name'], (strrpos($_FILES['usr_file']['name'], ".") + 1))))) {
$sText = 'Не удалось определить тип файла...';
} elseif(!in_array($ext, $fileTypes)) {
$sText = 'Для загрузки можно использовать только файлы следующих типов: ' . implode(', ', $fileTypes);
} else {
$usr_file = $_FILES['usr_file']['tmp_name'];
$sDirSave=DIR_UPLOADS_FILES.'/'.$oUserCurrent->getId();
$sFullPath=DIR_SERVER_ROOT . $sDirSave;
if (!is_dir($sFullPath)) {
mkdir($sFullPath);
chmod($sFullPath, 0755);
}
$sFileNameNew = func_generator();
$sFullFilePath = $sFullPath . '/' . $sFileNameNew . '.' . $ext;
$sFile=$sDirSave.'/'.$sFileNameNew . '.' . $ext;
if (move_uploaded_file($usr_file, $sFullFilePath)) {
chmod($sFullFilePath, 0644);
} else {
$sText = 'Не удалось загрузить файл.';
}
}
if (!is_null($sFile)) {
$bStateError = false;
$alt = (isset($_REQUEST['title']) and mb_strlen(trim($_REQUEST['title'], 'UTF-8'))) ? $alt = $_REQUEST['title'] : false;
$sText = '<a href="'.$sFile.'">' . (($alt!=false) ? $alt : 'Файл для скачивания') . '</a>';
}
} else {
$sText = 'Что-то не так...';
}
}
$GLOBALS['_RESULT'] = array(
"bStateError" => $bStateError,
"sText" => $sText,
);
?>
<pre>
<b>Request method:</b> <?=$_SERVER['REQUEST_METHOD'] . "\n"?>
<b>Loader used:</b> <?=$JsHttpRequest->LOADER . "\n"?>
<b>_REQUEST:</b> <?=print_r($_REQUEST, 1)?>
</pre>
В файле main.js добавляем:
function ajaxUploadFile(value, sToLoad)
{
var req = new JsHttpRequest();
req.onreadystatechange = function() {
if (req.readyState == 4) {
document.getElementById('debug').innerHTML = req.responseText;
closeWindowStatus();
if (req.responseJS.bStateError) {
showWindowStatus(req.responseJS.sText);
} else {
voidPutTag(sToLoad,req.responseJS.sText);
}
}
}
closeWindow('window_load_file');
showWindowStatus('Загрузка файла...');
req.open(null, DIR_WEB_ROOT+'/include/ajax/uploadFile.php', true);
req.send( { value: value } );
}
И соответственно в шаблон actions/ActionTopic/add.tpl добавляем:
<div id="window_load_file" style="display: none;">
<form method="POST" action="" enctype="multipart/form-data" id="form_upload_file" >
<table width="500px" border="0">
<tr>
<th align="center" colspan="2">Вставка файла</th>
</tr>
<tr>
<td align="right">Файл:</td>
<td width="100%"><input type="file" name="usr_file" style="width: 100%;" value=""></td>
</tr>
<tr>
<td align="right">Текст ссылки:</td>
<td><input type="text" name="title" style="width: 100%;"></td>
</tr>
<tr>
<td></td>
<td>
<input type="button" value="Загрузить" onclick="ajaxUploadFile(document.getElementById('form_upload_file'),'topic_text');">
<input type="button" value="Отмена" onclick="closeWindow('window_load_file'); return false;">
</td>
</tr>
</table>
</form>
</div>
В файле config.php (строка 40) добавляем:
define('DIR_UPLOADS_FILES',DIR_UPLOADS.'/files');
И еще необходимо создать в папке uploads подпапку files.
Вот и все.
С помощью массива $fileTypes вы можете определить доступные типы файлов.
Надеюсь, что со стилями сами разберетесь, так как у меня шаблоны другие совсем.
48 комментариев
1) окно вставки файла получается не как окно вставки картинки (всплывающее) а просто в странице.
2) после добавления файла появляется аяксовая «загрузка файла» и ничего не происходит. такое ощущение, что не подхватывается файл uploadFile.php
2) С этим подробнее, если можно. Это сразу после нажатия происходит и не выводится никаких сообщений? Какой файл пытаетесь скормить (размер, расширение)?
именно… а файлы без разницы, пробовал exe, zip, jpg.
все, я нашел косяк))) делал ночью, спать сильно хотелось, попытался сделать методом копипаста, а в начале файла uploadFile.php у вас пропущена магическая <?php> :) Огромное спасибо за мануал, пойду ковырять стили.
Для всплывающего окна просто можно буквально скопировать стиль с загрузки изображений. Там главное, чтобы позиционирование было абсолютным.
Ort как-то упоминал о том, что возможно сделать мусорщик, который будет проверять подобные файлы и удалять их… Ну а пока оно работает без этого.
у меня тут вопрос возник. допустим я имею массив
$fileTypes = array(«exe», «rar», «mp3», «avi», «flv»);
подскажите как сделать проверку по этому массиву и в зависимости от типа файла подставлялся свой код. например вместо
if (!is_null($sFile)) {
$bStateError = false;
$alt = (isset($_REQUEST['title']) and mb_strlen(trim($_REQUEST['title'], 'UTF-8')))? $alt = $_REQUEST['title'] : false;
$sText = '<a href="'.$sFile.'">' . (($alt!=false)? $alt : 'Файл для скачивания') . '</a>';
для exe и rar файла поставлялось бы
if (!is_null($sFile)) {
$bStateError = false;
$alt = (isset($_REQUEST['title']) and mb_strlen(trim($_REQUEST['title'], 'UTF-8')))? $alt = $_REQUEST['title'] : false;
$sText = '<video>'.$sFile.'</video>';
для mp3, avi, и flv файлов?
зы: иконку бы еще где взять подходящую…
Вот вам ^^)
данную строчку
Но я так и не разобрался, как сделать переменную. Carw, если не трудно, то дополни :)
Смысл в том, что в предложенном выше решении собранное в переменной $sToLoad не передается в поле с текстом топика. А в моем передается ;)
Что же касается проверки на тип файла, то у меня она работает, но работает криво. Определяется не в момент загрузки, а уже после. И единственная реакция это появление списка разрешенных типов на окошке со статусом загрузки. Как решить этот вопрос я даже и не думал пока.
Но можно сделать так:
onclick="ajaxUploadFile(document.getElementById('form_upload_file'),'topic_text');"
Поправил в топике.
Как поступить?
В какой директории создавать main.js?
Как сделал я (0.3.1):
1. Файл создан.
2. upload.js создан с этим содержим и он подгружается.
3. добавлено
в add.tpl, создан сам window_load_file.tpl и в него засунут передраный код из window_load_img.tpl:
потом в add.tpl дополнительно после кнопочки с картинками прописано:
Кнопочка появляется, но не нажимается. Я уверен что пропустил или не заметил что-то очень важное, помогите плз.
Сейчас как раз принимаюсь докручивать подобные мелочи — как прикручу — выложу.
неплохо бы поправить кто умеет(
лично у меня не получилось
Увы я не смог разобраться(