Скачивание файла с сайта PHP

146
09 июня 2019, 15:50

При нажатии на кнопку при помощи ajax запроса отправляется имя файла, в php файле принимается имя файла, после чего формируется zip архив и вызывается функция скачивания, но скачивания не происходит, так как header должен быть, как я понял, в самом начале кода. Что делать?

$filename = "";
$project_name = "";
$filename = "";
$FORM['filename'] = "";
$FORM['project_name'] = "";
if (isset($_POST['filename'])) $FORM['filename'] = htmlspecialchars($_POST['filename']);
if (isset($_POST['project_name'])) $FORM['project_name'] = htmlspecialchars($_POST['project_name']);
$filename_path = '../'.$FORM['filename'].'.zip';
$filename = '../'.$FORM['filename'];
$project_name = $FORM['project_name'];
Zip($filename,$filename_path);
file_force_download($filename_path);
function Zip($source, $destination) {
if (!extension_loaded('zip') || !file_exists($source)) {
    return false;
}
$zip = new ZipArchive();
if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
    return false;
}
$source = str_replace('\\', '/', realpath($source));
if (is_dir($source) === true)
{
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);
    foreach ($files as $file)
    {
        $file = str_replace('\\', '/', $file);
        // Ignore "." and ".." folders
        if( in_array(substr($file, strrpos($file, '/')+1), array('.', '..')) )
            continue;
        if (is_dir($file) === true)
        {
            $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
        }
        else if (is_file($file) === true)
        {
            $zip->addFromString(str_replace($source . '/', '', $file),     file_get_contents($file));
        }
    }
}
else if (is_file($source) === true)
{
    $zip->addFromString(basename($source), file_get_contents($source));
}
return $zip->close();
}
function file_force_download($file) {
    if (file_exists($file)) {
    // сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти     выделенной под скрипт
// если этого не сделать файл будет читаться в память полностью!
    if (ob_get_level()) {
        ob_end_clean();
    }
// заставляем браузер показать окно сохранения файла
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
// читаем файл и отправляем его пользователю
readfile($file);
exit;
 }
}
READ ALSO
Проверка на открытие или закрытие тега

Проверка на открытие или закрытие тега

К примеру переменная содержит строку:

112
Не работает require_once __DIR__

Не работает require_once __DIR__

Ситуацияphp7, OpenServer

120
Как получить чужой домен при запросе в AJAX?

Как получить чужой домен при запросе в AJAX?

documentreferrer с чужого домена у которого https - получаю пустое значение, это понятно, как можно по другому получить значение (домен) в ajax? $_SERVER['HTTP_REFERER']...

100