У меня есть файл download.php
который я передаю по почте с данными, а затем генерирует SVG-файл для загрузки, установив заголовок с
header('Content-Type: application/svg+xml');
header("Content-Disposition: attachment; filename=\"myfilename\"");
Теперь вопрос в том, как начать загрузку. Моей первой попыткой было поместить данные в форму и отправить их по почте с
<form id="svgform" method="post" action="download.php" style="display: none;">
...
</form>
Обычно это работает нормально. Это не изменит местоположение на download.php, а только инициирует загрузку. К сожалению, у этого метода есть предостережение о том, что (в редком случае), когда запрос php генерирует ошибку (по какой-либо причине), страница изменяется. Я хочу избежать изменения страницы любой ценой (поскольку несохраненные данные могут быть потеряны). У этого также есть некоторые другие странные побочные эффекты [1].
Итак, затем я попытался начать загрузку в новой вкладке с помощью
<form id="svgform" method="post" target="_blank" action="download.php" style="display: none;">
...
</form>
Это приводит к появлению уродливой белой страницы за мгновение до начала загрузки. Хуже того, в IE 11 белая страница не закрывается, а диалог загрузки появляется на предыдущей странице, поэтому пользователь не видит ее сразу.
Итак, мне интересно, как лучше идти вперед. Может ли загрузка быть лучше достигнута через AJAX и как?
[1] По какой-то причине Firefox не может генерировать HTML-данные инспектора, когда инспектор был открыт ранее. Вот способ понять, что я имею в виду. Осмотрите какой-нибудь элемент в Firefox и оставьте инспектора открытым. Теперь перейдите на страницу, которая загружает данные с помощью вышеуказанного метода (или аналогичного), например, http://download.cnet.com/CCleaner/3001-18512_4-10315544.html. Инспектор становится пустым, и ни один элемент больше не может быть проверен. Более того, некоторые из моих скриптов перестали работать должным образом в IE 11. Я пока не уверен, почему, возможно, это связано с тем, что происходит в Firefox.Поскольку вы не хотите изменять URL-адрес при публикации формы, но по-прежнему хотите, чтобы загрузка началась, вместо этого вы можете опубликовать форму iframe.
<form target="my-iframe-id" method="post" ... >
и iframe:
<iframe id="my-iframe-id" ... ></iframe>
Вы можете установить iframe как display: none;
так что это не показывает.
Других решений пока нет …