Всем привет. Написал класс для загрузки файлов на сервер и прошу оценить его идею.
Основная идея заключается в том, что бы оставить на поверхности как можно меньше работы, такой как валидация MIME типов и указание необходимого размер файла. Класс может совершать как одиночную загрузку файлов, так и множественную. Так же есть ещё несколько возможностей, которые я опишу ниже.
Вот код класса(так же файл с кодом приложил к сообщению). Сори что криво отформатирован, не помещается в монитор код
В приложенном файле чуть лучше
)
Внимание: после обсуждения класс потерпел некоторые изменения. Ввиду того что мне сейчас пора уходить, этот код я полностью редактировать не стал. Актуальная версия кода лежит в приложенном файле. Немного изменился принцип использования. Пример лежит в сообщении, которое я написал
13 Декабря, 2013 - 01:54:25
Спойлер (Отобразить)
PHP:
скопировать код в буфер обмена
class FileLoader{
private $errors = array(); private $_allowExt, $_fileSize, $_path, $_inputName, $_finfo;
private $_mimeTypes = array( 'gif' => 'image/gif',
'jpeg' => 'image/jpeg',
'png' => 'image/png',
'bmp' => 'image/x-ms-bmp',
'txt' => 'text/plain',
'msword' => 'application/msword'
);
public function __construct($allowExt, $fileSize, $inputName, $path = __DIR__){
$this->_allowExt = $allowExt;
$this->_fileSize = $fileSize * 1024;
$this->_inputName = $_FILES[$inputName];
$this->_path = $path;
$this->_finfo = new finfo(FILEINFO_MIME_TYPE);
}
private function checkUpload(){
$allowed = array_search(@$this->_finfo
->file($this->_inputName
['tmp_name']), $this->_mimeTypes
); if(in_array($allowed, $this->_allowExt
)){ filesize($this->_inputName
['tmp_name']) < $this->_fileSize ?
: $this->errors[] = 'Максимальный размер: '.$this->_fileSize
/ 1024 .' КБ'; $this->_inputName['error'] == 0 ?: $this->errors[] = 'Файл поврежден';
}else{
$this->errors[] = 'Неверный тип файла. Разрешенные типы: '.implode(', ', $this->_allowExt
); }return count($this->errors) != 0 ?
false : true; }
public function upload(){
if($this->checkUpload()){
echo 'Файл успешно загружен';
move_uploaded_file($this->_inputName
['tmp_name'], $this->_path
.'/'.$this->setHash($this->_inputName
['name'])); return true; }else{
return false;
}
}
private function checkMultiUpload(){
for($i = 0; $i < count($this->_inputName
['tmp_name']); $i++){ $allowed = array_search(@$this->_finfo
->file($this->_inputName
['tmp_name'][$i]), $this->_mimeTypes
); if(in_array($allowed, $this->_allowExt
)){ filesize($this->_inputName
['tmp_name'][$i]) < $this->_fileSize ?
: $this->errors[] = 'Максимальный размер: '.$this->_fileSize
/ 1024 .' КБ'; $this->_inputName['error'][$i] == 0 ?: $this->errors[] = 'Файл поврежден';
}else{
$this->errors[] = 'Неверный тип файла. Разрешенные типы: '.implode(', ', $this->_allowExt
); }
}
return count($this->errors) != 0 ?
: array("tmp" =>$this->_inputName
['tmp_name'], "name" => $this->_inputName['name']);
}
public function multiUpload(){
if(is_array($this->checkMultiUpload())){ $file = $this->checkMultiUpload();
for($i = 0; $i < count($file['tmp']); $i++){ }return true;
}else{
return false;
}
}
private function setHash($filename){
return $this->hash[] = md5(uniqid($filename)).$filename; }
}
Да кстати, пусть никого не пугает использованная
@, это нужно для того, что бы избежать ворнинга, который генерируется в некоторых случаях при неудачной загрузке. К сожалению, другими средствами отследить не удалось программно.
Теперь о том, как работает класс, его полезные свойства и способы применения.
Свойства:
public $hash - хранит в себе массив с названием/ями загруженных файлов. Его можно использовать после загрузки файлов для того, что бы добавить название загруженных файлов в БД(для тех, кто хранит имя файла в специальном поле БД и подгружает по названию файлы из папки). Хеширование происходит в методе setHash, там всего одна строчка, return $this->hash[] = md5(uniqid($filename)).$filename;
Если Вам нужен свой способ хеширования, то можно его описать изменив данную строчку.
private $_mimeTypes - это своего рода "база данных класса о MIME типах", которые класс может обработать. Свойство расширяемое, если необходимо сообщить классу о новых MIME типах, которые он может обработать, то достаточно добавить нужный нам MIME тип в это свойство как элемент массива и указать в качестве ключа соответствующее ему расширение.
private $_allowExt - Используется при создании объекта от данного класса. Туда необходимо передавать расширение файлов, которые вы хотите допустить к загрузке пользователем. Например Вы хотите что бы пользователь смог загружать только
gif и
jpeg файлы, то нужно передать следующие значения в это свойство:
Для чего нужны другие параметры, опишу чуть ниже.
Если приватное свойство(массив) класса $_mimeTypes знает о MIME типах, ключами которых является те значения, которые переданы первым параметром в конструктор при создании объекта, то класс обработает запрос клиента таким образом, что для загрузки будут доступны только те файлы, MIME типы которых соответствуют ключам, переданным первым параметром в конструктор в виде массива.
Второй параметр - Размер загружаемого файла в
килобайтах
Третий параметр - Названия инпута, который используется для загрузки файлов.
Например <input type="file"
name="upload" />
Четвертый параметр(необязательный) - Путь до папки, в которую должна идти загрузка файлов. Если данный параметр не указан, то файлы будут загружены в ту директорию, из которой был запущен скрипт.
Технические требования:
Перед использованием данного класса убедитесь, что в php.ini раскомментировано расширение
extension=php_fileinfo.dll
Пример использования:
Загрузка одиночных файлов:
Если требуется загружать только одиночный файл, то после создания объекта необходимо вызвать метод
upload
PHP:
скопировать код в буфер обмена
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$loader = new FileLoader
(array('gif', 'jpeg', 'bmp', 'msword'),1000,'upload','myfolder'); $loader->upload();
echo $loader->hash[0];//здесь лежит хеш-название загруженного файла
}