LINUX.ORG.RU

Приведение $_FILES в норму, может пригодится кому

 ,


0

3

Пишу класс для загрузки файлов на сервер, который тупо обрабатывает целиком весь $_FILES, а не какой-то один $_FILES['userfile'], как это обычно принято писать. Ну и фиг бы с ним, просто проходимся циклом по всем input'ам в $_FILES. Так и делаю.

Ещё один ньюанс при загрузке множественного количества файлов, когда мы указываем input type="file" name="userfile[]" скобочки, таким образом, php помещает список файлов в массив, а там, где [] таких скобочек небыло, там массива нет и файл указан как строка.

var_dump($_FILES);, когда мы загрузики в одной форме один файл, а в другой форме несколько. Обратите внимание, «name» в первом случае это одна строка, в другом случае это целый массив файлов. Оба этих формата мы приводим к одному общему виду.

А в конце получаем каждый загруженный файл, который аккурат находится внутри своего массива. Просто и без затей.

Было: http://paste.org.ru/?s6347o

Стало: http://paste.org.ru/?9tpulr

Надеюсь, это кому-то окажется полезным.

<?php
class Upload {
  public $Files = null;
  public $Directory = 'upload';
  function __construct($files) {
    $merge = array();
    foreach ($files as $input => $field) {
      $name = (array) $_FILES[$input]['name'];
      $type = (array) $_FILES[$input]['type'];
      $tmp_name = (array) $_FILES[$input]['tmp_name'];
      $error = (array) $_FILES[$input]['error'];
      $size = (array) $_FILES[$input]['size'];
      $merge = array_merge($merge, array_map(array($this, 'mapFiles'), $name, $type, $tmp_name, $error, $size));
    }
    $this->Files = $merge;
  }
  function mapFiles($name, $type, $tmp_name, $error, $size) {
    return array(
      'name' => $name,
      'type' => $type,
      'tmp_name' => $tmp_name,
      'error' => $error,
      'size' => $size
    );
  }
  function setFiles($files) {
    $this->Files = $files;
  }
  function setDirectory($directory) {
    $this->Directory = $directory;
  }
  function upload() {
    $files = $this->Files;
    foreach ($files as $file) {
      echo '<pre>';
      var_dump($file);
      echo '</pre>';
    }
  }
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  $upload = new Upload($_FILES);
  $upload->setDirectory('upload');
  $upload->upload();
}

Форма для примера:

<form action="" method="POST" enctype="multipart/form-data">
<input type="file" name="<?php echo uniqid(); ?>"><br>
<input type="file" name="<?php echo uniqid(); ?>[]" multiple="">
<input type="submit">
</form>

★★★★★

хз, о чем Вы похапешники вообще чешете, файлы приходят с пост-запросом, какая проблема их «загрузить»? Просто бей их по ограничителям, скидывай на диск, вот и все. Нет, у них там какие-то там скобочки, дамские премудрости...

anonymous ()

хз, о чем Вы похапешники вообще чешете, файлы приходят с пост-запросом, какая проблема их «загрузить»? Просто бей их по ограничителям, скидывай на диск, вот и все. Нет, у них там какие-то там скобочки, дамские премудрости...

anonymous ()

Парень, прекрати уже позорить этот несчастный язык своими изобретениями.

ThisNameWasFree ()
Последнее исправление: ThisNameWasFree (всего исправлений: 2)

код - сплошные нарушения и upload без чанков и конфигов nginx (для php-fpm) мало интересен

man стандарты кодирования (PSR и др.)

anonymous ()

Ты и в русский-то язык не умеешь. Не надо насиловать PHP.

Valkeru ★★★★ ()

Одумайся, не делай так...

Возьми фреймворк какой-нибудь, посмотри как у них сделано для начала.

Адская лапша

BaBL ★★★★★ ()
Последнее исправление: BaBL (всего исправлений: 1)
function setFiles($files) { }
function setDirectory($directory) { }

Так держать, Спуфи. Когда ты еще вместе с ними будет тыкать геттеры везде где попало, можно будет смело сказать – ты понял всю суть жабо-пыхо-макаки.
http://cs622431.vk.me/v622431024/3b89a/Bv7KbNlZc3c.jpg

znenyegvkby ()
Ответ на: комментарий от BaBL

Возьми фреймворк какой-нибудь, посмотри как у них сделано для начала.

как это обычно принято писать

Думаю, он посмотрел и решил сделать свой велосипед с квадратными колёсами.

Valkeru ★★★★ ()
public $Directory = 'upload';
function setDirectory($directory) {
    $this->Directory = $directory;
}

Мммм... Зачем setDirectory, если $Directory - public?

anonymous ()
Ответ на: комментарий от anonymous

*хотел написать про крестик и трусы, но сдержался

anonymous ()

Вряд ли кому то это поможет т.к. проще самому сесть и написать эти несколько строчек нечем искать и копировать с форумов.

iluha16 ()

Кошмар какой. После этого и говорят, что php - какашка

Работает только при display_errors = off ?

r_asian ★☆☆ ()
Ответ на: комментарий от anonymous

Идея хорошая, но... Пых же. В $_POST нет файлов, они уже загружены в tmp, данные о них отпрепарены (пути и ошибки) и находятся в $_FILES

deep-purple ★★★★★ ()
Ответ на: комментарий от cli

мне они не нравятся в своих мелочах.

http://www.yiiframework.com/wiki/2/how-to-upload-a-file-using-a-model/

<?php echo CHtml::form('','post',array('enctype'=>'multipart/form-data')); ?>

вот в Yii, рисуют тэг form, указывая ему дополнительные параметры, — а почему action и method отдельно, а enctype отдельно? чем допустим enctype хуже, что не заслужил своего места под солнцем, отдельным параметром? или тогда, зачем вообще параметры нужны, почему нельзя было сразу всё в одном массиве передать, и action и method, рядом с enctype, тогда бы гормонично смотрелось. не?

другой фреймворк нарыл, https://github.com/flourishlib/flourish-classes/blob/master/fUpload.php — тут у них «всё есть объект», даже когда новый файл создаёшь return fFilesystem::createObject($file_name);, функция вовзращает тебе не путь до этого файла, не массив со всякими ништяками для этого файла, а просто объект этого файла. и что, это ли вершина совершенства кода? когда «всё есть объект»? а почему так не делают в Yii например, там вот массивами передают информацию.

и таких мелочей во всех этих фреймворках — тысячи. они не логичны. вернее, фрейморки отображают лишь личное видение своего автора.

и сейчас я тоже пишу свой класс для загрузки файлов и самое трудное — не написать красивый код, а написать интуитивно понятно, логично, чтобы каждая домохозяйка разобралась сходу.

продумать API — самое сложное. вот лучше бы кто-нибудь нарисовал красивый API мне, а я его напишу.

Spoofing ★★★★★ ()
Ответ на: комментарий от deep-purple

Вот скажите, пожалуйста, вы считаете такое решение красивым? оно логично? Понятно? Чтобы вы сделали по-другому?

<?php
$upload = new Upload();
$upload->setDirectory('./upload');

$upload->addForm(@$_FILES['file']);
$upload->addForm(@$_FILES['userfile']);
$upload->addFile('/home/username/index.html');

foreach ($upload->List as $_FILE) {
	$name = $_FILE['name'];
	$type = $_FILE['type'];
	$tmp_name = $_FILE['tmp_name'];
	$error = $_FILE['error'];
	$size = $_FILE['size'];

	$upload->tryUpload($name, $type, $tmp_name, $error, $size);
}

$upload->end();
Spoofing ★★★★★ ()
Ответ на: комментарий от Spoofing
<?php
$зубы = new Зубы();
$зубы->указатьМестоКормления('./миска');

$зубы->добавитьКролика((молчи если еды нет)$_ЕДА['одуванчик']);
$зубы->добавитьКролика((молчи если еды нет)$_ЕДА['подорожник']);
$зубы->добавитьКлетку('/за/домом/угол.огорода');

foreach ($зубы->еда as $_ОБЪЕДОК) {
	$название = $_ОБЪЕДОК['название'];
	$тип = $_ОБЪЕДОК['тип'];
	$временный_тип = $_ОБЪЕДОК['временный_тип'];
	$ошибка = $_ОБЪЕДОК['ошибка'];
	$размер = $_ОБЪЕДОК['размер'];

	$зубы->попробуйПрожевать($название, $тип, $временный_тип, $ошибка, $размер);
}

$зубы->положитьНаПолку();

Я бы сделал подругому ВСЁ.

deep-purple ★★★★★ ()
Ответ на: комментарий от Spoofing

Ибо нефиг смотреть всякое говно типа jQuery UPLOADER! COOL! GREATE! [censored]. Код любого адекватного фреймворка посмотри уже.

znenyegvkby ()
Ответ на: комментарий от Spoofing

вот в Yii, рисуют тэг form, указывая ему дополнительные параметры, — а почему action и method отдельно, а enctype отдельно? чем допустим enctype хуже, что не заслужил своего места под солнцем

Частотой своей применимости хуже. Задача фреймворка снять рутину с разработчика.

А твоя лапша ничуть не лучше и не универсальнее, не умеет name=«post[]file[]», смысл от того что ты ее лепишь? Очередной частный случай и «теперь у нас 15 стандартов»?

Посмотри аплод на php.net, там куча комментариев, где твой разбор решается в 5 раз меньшим количеством кода, удачные решения отплюсованы.


А хочешь фигней страдать - пиши свою лапшу в:

yii\helpers\BaseHtml::tag()

Yii для таких как ты тоже готова.

BaBL ★★★★★ ()
Ответ на: комментарий от anonymous

как ты яго нежно, то..

. Я его «пуфсом» зову, вот, так это по-богатЫрски, лалъ $@ @$ $@ ...

anonymous ()

$merge = array();

Дальше даже не читал. Пых 5.3 и ниже не нужен.

border-radius ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.