Пытаюсь использовать ajax загрузчик файлов (). Получается post запрос например files.html?qqfile=image.jpg
Через оперу все грузится отлично, но например через FF 3.6 загрузки не получается. Проверка ^if($form:qqfile is 'file'){true;false} говорит, что $form:qqfile не является файлом.
Могу предположить, что сам файл приходит просто в теле сообщения (если это бинарные данные, то может возникнуть серьезная проблема с их получением), либо еще в какой-то переменной внутри post-данных. Можно попробовать посмотреть, что еще приходит в forms (^form:fields.foreach[k;v]...)
из этого однозначно следует, что кто-то явно в qqfile положил строку следующего содержания: '0887ABBC-3261-446F-9C2F-E46F1595DC54.jpg'
если бы проблема была в неправильном/отсутствующем enctype или ещё к чем-то подобном, то в этой переменной могло быть только пусто, а не такое, явно сформированное добро.
более того, это явно сформированное добро передаётся в get (query), т.е. там в принципе не может быть файла (хотя возможно, что данный загрузчик использует одноимённые переменные -- к get имя файла, а в post -- его содержимое, но это простейший путь к проблемам, т.е. я не думаю, что так сделано в загрузчике). вы уверены, что у вашей формы прописан правильный @method?
предлагаю проверить @method/@enctype у посмотреть код js чтобы убедиться, что в qqfile не передаётся имя файла, а сам файл должен-бы передаваться в другой переменной, но не передаётся из-за проблем с enctype.
а ещё для решения этой проблемы может помочь дока по XHR. очевидно, что курить её должен тот, кто пытается использовать данный код :)
загрузите расширение в фаербаге. Откройте его на странице с загрузчиков, выберите вкладку сеть и там включить. После этого страничка скорее всего пере загрузится и начнет появляться список со всеми запросами браузера. Внимательно изучите запросы после нажатии кнопки отправить в скрипте, там будет полный запрос с гет и пост данными.
оно определяется как "dat". Если файл переименовать с изначальным расширением, он открывается вроде нормально. Как быть в такой ситуации? Брать информацию о расширении файла из поля "qqfile" и сохранять файл с ним?
информация об имени файла в общем случае не содержится в теле файла. а в теле запроса содержится тело файла. $request:post-file создаётся из тела файла и в качестве имени файла используется заглушка с расширением dat.
для того, чтобы узнать имя файла -- его надо передать, и именно для этого, похоже, в query и присутствует qqfile.
Если речь идет о графических файлах, то в пакете Image Magick есть утилита identify. Эти способы несколько надежнее простой передачи имени файла из браузера.