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] |
не пробовали смотреть что выдаётся в http заголовке content-disposition? |
$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 |
я запутался -- второй вариант, это какой? |
| для скачивания content-disposition должен быть. |
первый - $f[^xmldoc.file[ $.indent[yes] ]]
второй - $f[^file::create[text;export.xml;^xmldoc.string[ $.indent[yes] ]]]
расчет окончен :) |
в коде вижу, что 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 для обсуждения (что-то из этого там уже есть) |
в HEAD методу ^xdoc.file[] добавлена опция $.name[имя файла] |