Загрузка данных в $ _FILES без формы - PullRequest
1 голос
/ 23 апреля 2011

Хорошо, так что небольшое предисловие: я работаю над добавлением перетаскивания файлов загрузки в систему управления курсами под названием Moodle (в частности, 2.0.1).Эта версия Moodle использует инфраструктуру YUI3 и загружает данные формы вместе с файлом для загрузки и именем для сохранения как через io-upload-iframe.Файл хранится в суперглобальном $ _FILES до тех пор, пока файловая система не отправит соответствующие данные о том, где его постоянно хранить.

Проблема, с которой я столкнулся, заключается в том, что вместо использования функций перетаскивания в YUI3 (которые,от беглого взгляда на их веб-сайт не все виды перетаскивания, которые мне нужны в любом случае) Я использую собственный HTML5-код ​​перетаскивания.Похоже, это работает в большинстве основных браузеров (у меня не было времени, чтобы много тестировать, и это выходит за рамки этого проекта).Проблема, с которой я столкнулся, заключается в том, что этот дизайн DND немедленно дает вам файл из объекта Event в javascript.Я мог бы отправить этот файловый объект куда угодно, но файловая система предназначена только для обработки переменных, временно хранящихся в переменной $ _FILES.К сожалению, я не смог найти простой способ хранения этого файла.Я мог бы получить HTTP-запрос различной формы (один из специальных запросов YUI3 Y.io () или XHR), но для этого требуется много дублированного кода из исходного исходного кода.

У кого-нибудь есть предложения

1 Ответ

0 голосов
/ 23 апреля 2011

Трудно сказать, в чем ваша проблема. Но каким бы ни был ваш сервер или файловая система, это не имеет ничего общего с временностью массива $ _FILES.

Когда вы получите событие DND, и YUI впоследствии отправит файл, вы получите некоторые данные либо в $ _FILES, либо в $ _POST. Если это так, просто используйте move_uploaded_file или file_put_contents и сохраните его в другом месте .

Присвойте этому перемещенному файлу хэш md5() в качестве имени и верните его в качестве идентификатора файла для вашего запроса загрузки AJAX-DND.

Затем вы можете использовать этот хэш-идентификатор в своем коде Javascript и обратиться к уже загруженному файлу изображения по этой ссылке. Если ваше приложение инициирует нормальный запрос формы после перетаскивания, вы просто включаете собранные идентификаторы ссылок на изображения. И, таким образом, ваш код на стороне сервера может связать его снова.

Вы даже можете восстановить массив $ _FILES, если хотите:

foreach ((array)$_POST["prev_image_ids"] as $md5) {
    $md5 = basename($md5);
    $_FILES["image"][] = array(
        "tmp_name" => $fn="./already-uploaded/$md5",
        "size" => filesize($fn), "type"=>"image/whatever",
        "name" => "unknown.jpg", "error"=>UPLOAD_ERR_OK,
    );   // you could store away those original attributes too
}
...