Диалог Сохранить как
Всем привет. У меня в проекте все управляется через Ajax, ответ в виде массива перебираю и отрабатываю
$.ajax({
type: "POST",
url: "/ajax",
dataType: 'json',
cache: false,
data: ds,
complete: function(resp) {
var dopParams = resp.responseJSON.dop; //тут массив из инструкций JQ
for (let i = 0; i < dopParams.length; i++) {
eval(dopParams[i]);
}
}
});
В РНР файле формирую JQ инструкции наподобие
$dop[] = "$('#my-element').html('test')";
return $dop;
Все отрабатывается корректно, даже заполнение data-table. Потребовалось в ответ на действие пользователя сгенерить некий текстовый/бинарный файл и предложить пользователю выбрать место для сохранения. На тестовой страничке без Ajax все работает:
$data = file_get_content('/path/to/file');
header('Content-Disposition: attachment; filename="NewFileName.txt"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); // Для IE
header('Pragma: public');
header("Content-Length: ".strlen($data));
А если логику перенести в проект сайта, вызов которой осущеcтвляется через Ajax, то возврат этих строк вызывает ошибку:
dop[0] = "header(\"Content-Disposition: attachment; filename=\\\"NewFileName.txt\\\"\")" //собственно сама строка
Ошибка - Uncaught ReferenceError: header is not defined // в строке где (eval(dop[0]))
как "пропустить" header ?
Ответы (1 шт):
Автор решения: Andy_bat
→ Ссылка
В результате решил проблему:
- Пользователь нажимает кнопку "Сохранить", через Ajax от браузера до сервера передается параметр, например 'delo'='save-file'.
- На сервере по этому параметру вызывается соответствующая функция, в которой
- считывается подготовленный ранее файл,
- создается массив в котором построчно содержится содержимое файла (он у меня с десяток- другой строк, не экспериментировал с сотнями строк)
- в Ajax возвращается заполненный массив: 1 элемент имя файла [name], 2 элемент - вложенный массив [soder]
- На браузере путем внутренних манипуляций (создание и нажимание ссылки) создается Blob и сохраняется. Для этого используется функция:
function saveToPC(arr){ let str =""; let soder = arr['soder']; let name = arr['name']; soder.forEach(function(entry) { str += entry; }); let blob = new Blob([str], {type: "text/plain"}); let link = document.createElement("a"); link.setAttribute("href", URL.createObjectURL(blob)); link.setAttribute("download", name); link.click(); }
Может кому-то пригодится, расписывал подробно.