$file = fopen("test.txt", "w") or die("Unable to open file!");
fwrite($file, "lorem ipsum");
fclose($file);
header("Content-Disposition: attachment; filename=\"" . basename($file) . "\"");
header("Content-Type: application/force-download");
header("Content-Length: " . filesize($file));
header("Connection: close");
Файл создается / открывается и записывается, но не загружается.
Любая помощь?
Создание файла на диске и отправка файла клиенту - это две совершенно разные вещи. Вы создаете файл, а затем ничего не отправляете клиенту.






Вам нужно что-то вывести, чтобы пользователь мог загрузить файл. Попробуйте этот код:
$file = fopen("test.txt", "w") or die("Unable to open file!");
fwrite($file, "lorem ipsum");
fclose($file);
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename = "FILENAME"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: test.txt');
ob_clean();
flush();
readfile('text.txt');
exit();
Замените FILENAME именем файла, который пользователь должен загрузить.
Правильный способ сделать это:
<?php
$file = "test.txt";
$txt = fopen($file, "w") or die("Unable to open file!");
fwrite($txt, "lorem ipsum");
fclose($txt);
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename='.basename($file));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
header("Content-Type: text/plain");
readfile($file);
?>
@puerto Убедитесь, что вы правильно его скопировали. Я бы никогда не отправил ответ, если бы сначала не проверял себя. Работает отлично :)
@puerto На заметку: имейте в виду, что вы не можете использовать это в другом коде, где есть вывод перед заголовками. И убедитесь, что ваш редактор не сохраняет код с Спецификация
Я создаю новый файл только с вашим кодом, и он работает. Нажатие на кнопку и запуск через ajax - не работает. Так следует ли мне иметь специальную страницу php только для загрузки?
@puerto Да. Ajax не предназначен для загрузки файлов. Вы можете просто создать всплывающее окно для страницы загрузки. Он автоматически закроется после начала загрузки.
После того, как вы создали файл, вы должны выход его содержимое в браузере, например, с помощью fpassthru, поскольку вы используете обработчик файлов:
$path = "test.txt";
$file = fopen($path, "w") or die("Unable to open file!");
fwrite($file, "lorem ipsum");
//fclose($file); // do not close the file
rewind($file); // reset file pointer so as output file from the beginning
// `basename` and `filesize` accept path to file, not file descriptor
header("Content-Disposition: attachment; filename=\"" . basename($path) . "\"");
header("Content-Type: application/force-download");
header("Content-Length: " . filesize($path));
header("Connection: close");
fpassthru($file);
exit();
Я думаю, вам нужен контент только для процесса загрузки
<?PHP
//config
$namefile = "test.txt";
$content = "lorem ipsum";
//save file
$file = fopen($namefile, "w") or die("Unable to open file!");
fwrite($file, $content);
fclose($file);
//header download
header("Content-Disposition: attachment; filename=\"" . $namefile . "\"");
header("Content-Type: application/force-download");
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header("Content-Type: text/plain");
echo $content;
Спасибо.
Как его можно скачать, если вывести ничего такого?