Я знаю, что подобные вопросы были заданы раньше, но я считаю, что у этого есть некоторая разница.
На моей веб-странице есть Iframe
. Этот iframe загружает страницу из какого-либо другого домена (работает междоменный скриптинг). Теперь, когда я нажимаю кнопку в этом iframe, он делает запрос AJAX
через jQuery
и создает текстовый файл на сервере PHP
. Теперь я хочу, чтобы появилось нормальное диалоговое окно «Сохранить как», чтобы я мог загрузить этот файл с сервера.
Я пробовал все функции Content-Disposition
и header()
на стороне PHP, но диалог «Сохранить как» не отображается, хотя файл успешно создан на сервере. Я думаю, проблема в том, что я хочу запустить загрузку файла из iframe, который загружает контент из какого-либо другого домена.
Есть ли обходной путь для этого?
Благодарю.
Я нашел решение самостоятельно. Вместо AJAX
используется технология Iframe
. Следующий код jQuery
должен быть записан в iframe. Он запускает загрузку через iframe вместо запроса AJAX
на сервер.
$(document).ready(function(){ $('#download').click(function(){ var ifr = $('<iframe id="secretIFrame" src="" style="display:none; visibility:hidden;"></iframe>'); $('body').append(ifr); var iframeURL = 'http://you_domain.com/download.php?str='+encodeURIComponent(data_to_be_posted); ifr.attr('src', iframeURL); return false; }); });
Это код для download.php
:
<?php $str = html_entity_decode($_REQUEST['str']); $file_name = 'export_data.txt'; header("Cache-Control: ");// leave blank to avoid IE errors header("Pragma: ");// leave blank to avoid IE errors header("Content-Disposition: attachment; filename=\"".$file_name."\""); header("Content-length:".(string)(filesize($str))); header("Content-Type: application/force-download"); header("Content-Type: application/download"); header('Content-Type: application/octet-stream'); header('Content-Type: application/txt'); header("Content-Transfer-Encoding: binary "); echo $str; exit; ?>