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

XML для скачивания

#1skiv
09.09.11 11:13 / 11:26
www.parser.ru → | ответить → | в избранное →

XML для скачивания

Делаю xml-файл со списком заказов на сайте, который должен скачиваться пользователем для последующей загрузки в 1с.

Проблема в том что браузер (пробовал оперу и хром) не предлагает скачать файл, просто выводит XML на экран. Конструкция следующая:

$xmldoc[^xdoc::create[document]]
...
$f[^xmldoc.file[ $.indent[yes] ]]
$response:download[$f]


В то же время, если сделать текстовый файл, то все ок:

$f[^file::create[text;export.csv;EXPORT DATA]]
$response:download[$f]


Вопрос: как заставить браузер предложить сохранять XML на диск как файл?

UPD: нашел, все просто

$f[^file::create[text;export.xml;^xmldoc.string[ $.indent[yes] ]]]
$response:download[$f]
#2Misha v.3
→ skiv [#1] | 09.09.11 11:59
www.parser.ru → | ответить → | в избранное →

не пробовали смотреть что выдаётся в http заголовке content-disposition?

#3skiv
→ Misha v.3 [#2] | 09.09.11 12:28
www.parser.ru → | ответить → | в избранное →
$xmldoc[^xdoc::create[document]]
$f[^xmldoc.file[ $.indent[yes] ]]
$f[^file::create[text;export.xml;^xmldoc.string[ $.indent[yes] ]]]
$response:download[$f]


посмотрел драгонфлаем, в первом варианте:

Исходный ответ
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 09 Sep 2011 08:20:16 GMT
Content-Type: text/xml; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
Content-Encoding: gzip

во втором варианте Content-Disposition присутствует:

Исходный ответ
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 09 Sep 2011 08:20:33 GMT
Content-Type: text/xml; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
Content-Disposition: attachment; filename=export.xml
Content-Encoding: gzip
#4Misha v.3
→ skiv [#3] | 09.09.11 12:49
www.parser.ru → | ответить → | в избранное →

я запутался -- второй вариант, это какой?

для скачивания content-disposition должен быть.
#5skiv
→ Misha v.3 [#4] | 09.09.11 12:55
www.parser.ru → | ответить → | в избранное →
первый -
$f[^xmldoc.file[ $.indent[yes] ]]

второй -
$f[^file::create[text;export.xml;^xmldoc.string[ $.indent[yes] ]]]

расчет окончен :)
#6Misha v.3
→ skiv [#5] | 10.09.11 04:29 / 04:31
www.parser.ru → | ответить → | в избранное →
в коде вижу, что content-disposition выдаётся только если у файла явно задано имя файла (неявно оно имеет значение "noname.dat" и задано у всех фалов).

при ^xdoc.file[] имя оказывается неопределённым, т.к. параметры преобразования сейчас эквивалентны тому, что можно задать в <xsl:options/>.

а в $response:download нельзя отдать файл + указать его имя.

т.е. получается, что сейчас так сделать нельзя. но есть несколько workaround-ов:
1. после $response:download можно ручками задать правильный $response:content-disposition (с "attachement" + именем файла)
2. использовать промежуточный ^file::create[]

но по хорошему, конечно-же, было-бы кстати:
- иметь возможность задать имя файла у ^xdoc.file[], например так: ^xdoc.file[имя файла;опции преобразования] или так ^xdoc.file[$.name[имя файла]]
- иметь возможность переопределить имя файла у уже существующего объекта типа file, например так: $f.name[новое имя файла]
- иметь возможность задать имя файла у $response:download, например так: $response:download[$.value[$file_or_string] $.name[filename.ext]]

добавлю в наше todo для обсуждения (что-то из этого там уже есть)
#7Misha v.3
→ skiv [#1] | 11.10.11 18:04
www.parser.ru → | ответить → | в избранное →

в HEAD методу ^xdoc.file[] добавлена опция $.name[имя файла]

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