parserALT
Страницы форума: ← Назад | 1 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 600 | Дальше →

ajax, XHR

#1Максим
30.01.11 18:57
www.parser.ru → | ответить → | в избранное →

ajax, XHR

Пытаюсь использовать ajax загрузчик файлов (http://valums.com/ajax-upload/). Получается post запрос например files.html?qqfile=image.jpg

Через оперу все грузится отлично, но например через FF 3.6 загрузки не получается. Проверка ^if($form:qqfile is 'file'){true;false} говорит, что $form:qqfile не является файлом.

Возможно ли решить проблему и как?

Parser/3.4.0

Спасибо.
#2Sumo
→ Максим [#1] | 31.01.11 12:00
www.parser.ru → | ответить → | в избранное →

files.html?qqfile=image.jpg - это НЕ post-запрос.

#3Sumo
→ Sumo [#2] | 31.01.11 12:04
www.parser.ru → | ответить → | в избранное →
Могу предположить, что сам файл приходит просто в теле сообщения (если это бинарные данные, то может возникнуть серьезная проблема с их получением), либо еще в какой-то переменной внутри post-данных. Можно попробовать посмотреть, что еще приходит в forms (^form:fields.foreach[k;v]...)
#4Максим
→ Sumo [#3] | 31.01.11 12:18
www.parser.ru → | ответить → | в избранное →
^form:fields.foreach[k;v]{$k - $v}[^; ]

id - 17; mode - add; qqfile - 0887ABBC-3261-446F-9C2F-E46F1595DC54.jpg
#5Sumo
→ Максим [#4] | 31.01.11 12:23
www.parser.ru → | ответить → | в избранное →

В request:body что приходит?

#6Максим
→ Sumo [#5] | 31.01.11 12:35
www.parser.ru → | ответить → | в избранное →
Я может быть неправильно смотрю $request:body, делаю так в files.html:

^if($form:qqfile is "file"){
	...сохраняю...
}{
	$document[$request:body] 
	^document.save[saved.txt] 
	$document 
}


В saved.txt после загрузки файла:
яШяб

Через firebug в ответе:
����
#7Sumo
→ Максим [#6] | 31.01.11 12:37
www.parser.ru → | ответить → | в избранное →

Смотрите, что делает код на javascript'е. А именно, что и в какие переменные он передает.

#8Misha v.3
→ Максим [#6] | 31.01.11 13:03
www.parser.ru → | ответить → | в избранное →

смотреть надо не в ответе, а в запросе

#9Misha v.3
→ Максим [#4] | 31.01.11 13:07 / 13:10
www.parser.ru → | ответить → | в избранное →
из этого однозначно следует, что кто-то явно в qqfile положил строку следующего содержания: '0887ABBC-3261-446F-9C2F-E46F1595DC54.jpg'

если бы проблема была в неправильном/отсутствующем enctype или ещё к чем-то подобном, то в этой переменной могло быть только пусто, а не такое, явно сформированное добро.

более того, это явно сформированное добро передаётся в get (query), т.е. там в принципе не может быть файла (хотя возможно, что данный загрузчик использует одноимённые переменные -- к get имя файла, а в post -- его содержимое, но это простейший путь к проблемам, т.е. я не думаю, что так сделано в загрузчике). вы уверены, что у вашей формы прописан правильный @method?

предлагаю проверить @method/@enctype у посмотреть код js чтобы убедиться, что в qqfile не передаётся имя файла, а сам файл должен-бы передаваться в другой переменной, но не передаётся из-за проблем с enctype.

а ещё для решения этой проблемы может помочь дока по XHR. очевидно, что курить её должен тот, кто пытается использовать данный код :)
#10Максим
→ Sumo [#7] | 31.01.11 13:12
www.parser.ru → | ответить → | в избранное →
        // build query string
        var queryString = '?qqfile=' + encodeURIComponent(name);
        for (var key in params){
            queryString += '&' + key + '=' + encodeURIComponent(params[key]);
        }

        xhr.open("POST", this._options.action + queryString, true);
        xhr.send(file);  


Я так понимаю, что в данном случае в qqfile отправляется только имя файла а файл шлется как то другим полем? Или это я не то смотрю?
#11Misha v.3
→ Максим [#10] | 31.01.11 13:17
www.parser.ru → | ответить → | в избранное →

да, вы поняли правильно.

но в данном фрагменте кода нет информации о том, в каком именно поле отправляется само содержимое файла.

я бы всё таки глянул каким-нить firebug-ом (ну... аналогом, т.к. его у меня нету) или глянут в доке, вместо ковыряния js.
#12Максим
→ Misha v.3 [#8] | 31.01.11 13:19
www.parser.ru → | ответить → | в избранное →
Запрос не пустой.

Там типа этого:
#13Максим
→ Максим [#12] | 31.01.11 13:21
www.parser.ru → | ответить → | в избранное →
&#255;&#216;&#255;&#225;&#65533;!Exif&#65533;&#65533;II*&#65533;!&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#255;&#236;&#65533;!Ducky&#65533;!&#65533;!&#65533;&#65533;&#65533;d&#65533;&#65533;&#255;&#225;!mhttp://ns.adobe.com/xap/1.0/&#65533;<?xpacket begin="&#239;»&#191;" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"

и так далее

Content-Length 1350293
Content-Type image/jpeg
#14Misha v.3
→ Максим [#13] | 31.01.11 13:29
www.parser.ru → | ответить → | в избранное →

вы разве не можете выбрать маленький текстовый файл, отправить запрос и привести полностью его текст?

и вы похоже, приводите только тело запроса, а не его целиком.

P.S. в HEAD/текущей бэте есть $request:post-body
#15Максим
→ Misha v.3 [#14] | 31.01.11 13:49
www.parser.ru → | ответить → | в избранное →
Опять же, если я правильно понимаю что нужно сделать и как, вот:

Создал файл test.txt где записано "test XHR". Отправляю файл.

В $request:body получается "test XHR".

Через firebug то же самое:
Post
Исходный код
test XHR

Поправьте меня, пожалуйста, если что-то не то делаю.
#16max_rip
→ Misha v.3 [#11] | 31.01.11 14:18
www.parser.ru → | ответить → | в избранное →

firebug

загрузите расширение в фаербаге.
Откройте его на странице с загрузчиков, выберите вкладку сеть и там включить.
После этого страничка скорее всего пере загрузится и начнет появляться список со всеми запросами браузера. Внимательно изучите запросы после нажатии кнопки отправить в скрипте, там будет полный запрос с гет и пост данными.
#17Максим
→ Misha v.3 [#14] | 31.01.11 14:57
www.parser.ru → | ответить → | в избранное →
Через $request:post-body удается сохранять. Спасибо за подсказку.
Но при попытке определить расширение файла
$file_ex[^file:justext[${request:post-body.name}]]

оно определяется как "dat". Если файл переименовать с изначальным расширением, он открывается вроде нормально. Как быть в такой ситуации? Брать информацию о расширении файла из поля "qqfile" и сохранять файл с ним?
#18Misha v.3
→ Максим [#17] | 31.01.11 15:36
www.parser.ru → | ответить → | в избранное →
информация об имени файла в общем случае не содержится в теле файла.
а в теле запроса содержится тело файла. $request:post-file создаётся из тела файла и в качестве имени файла используется заглушка с расширением dat.

для того, чтобы узнать имя файла -- его надо передать, и именно для этого, похоже, в query и присутствует qqfile.
#19Максим
→ Misha v.3 [#18] | 31.01.11 15:52
www.parser.ru → | ответить → | в избранное →

спасибо огромное за ответы

#20Sumo
→ Максим [#17] | 31.01.11 15:53
www.parser.ru → | ответить → | в избранное →

http://ru.wikipedia.org/wiki/File_(Unix)

Если речь идет о графических файлах, то в пакете Image Magick есть утилита identify. Эти способы несколько надежнее простой передачи имени файла из браузера.
#21Максим
→ Sumo [#20] | 31.01.11 16:05
www.parser.ru → | ответить → | в избранное →

в моем случае могут быть любые файлы

Страницы форума: ← Назад | 1 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 600 | Дальше →