Скачать шапку для zip архива

Я настоящий новичок в php, и у меня есть этот код, который должен позволить создать zip-архив, содержащий файлы в папке, где находится php-файл, дать архиву имя папки, сохранить его в другой папкеи скачать.

$zipname = getcwd();
$zipname = $zipname.'.zip';
$zip = new ZipArchive;
$zip->open('D:/mypath/zip/'.basename($zipname).'', ZipArchive::CREATE);
if ($dir_handle = opendir('./')) {
      while (false !== ($entry = readdir($dir_handle))) {
    if ($entry != "." && $entry != ".." && !strstr($entry,'.php')) {
        $zip->addFile($entry);
    }
  }
  closedir($dir_handle);
}
else {
die('file not found');
}

$zip->close();

Пока все хорошо: созданный zip имеет правильное имя ("foldername.zip") и находится именно там, где я хочу, в папке /zip/ в корневом каталоге сервера. Теперь я застрял с этими заголовками и не могу указать для загрузки правильное местоположение и имя файла.

header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="'.basename($zipname).'"');
header('Content-Length: ' . filesize($zipname));
header("Location: /zip/$zipname");
?>

изменение последнего заголовка на

header("Location: /zip/foldername.zip");

у меня это работает, но я ищу решение, которое не заставит меня редактировать php каждый раз, когда я создаю новую папку.

РЕДАКТИРОВАТЬ: Вот рабочий код

<?php
$zipname = getcwd();
$zipname = substr($zipname,strrpos($zipname,'\\')+1);
$zipname = $zipname.'.zip';
$zip = new ZipArchive;
$zip->open('D:/inetpub/webs/mydomaincom/zip/'.basename($zipname).'', ZipArchive::CREATE);
if ($dir_handle = opendir('./')) {
      while (false !== ($entry = readdir($dir_handle))) {
    if ($entry != "." && $entry != ".." && !strstr($entry,'.php')) {
        $zip->addFile($entry);
    }
  }
  closedir($dir_handle);
}
else {
die('file not found');
}

$zip->close();

header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="'.basename($zipname).'"');
header('Content-Length: ' . filesize($zipname));
header('Location: /zip/'.$zipname);
?>

person brunogermain    schedule 30.10.2015    source источник
comment
Сгенерируйте случайную строку и создайте подпапку. Переместите файл туда и включите случайно сгенерированную строку в окончательные заголовки. Вы можете использовать /tmp/, если хотите, чтобы файл загружался только на мгновение и освобождал место. Но вы не указали это в своем случае, поэтому я предполагаю, что вы хотите сохранить zip-архивы.   -  person Rimble    schedule 30.10.2015
comment
Мне не нужно хранить zip-архивы, но я действительно не знаю, как делать то, что вы говорите. я плохо разбираюсь в кодировании   -  person brunogermain    schedule 30.10.2015
comment
Мне немного трудно понять, какова ваша цель. Вы хотите сделать программу, которая конвертирует любую заданную папку в zip-файл? Как я прочитал это прямо сейчас, единственная проблема, с которой вы столкнулись, заключается в том, что вам нужно переместить и отредактировать файл, чтобы преобразовать папку в архив .zip. Вы можете превратить весь свой код в функцию и передать переменную, а именно каталог, который вы не хотите сжимать. Тогда вы могли бы использовать его из любого места.   -  person Rimble    schedule 30.10.2015
comment
моя цель состоит в том, чтобы каждый из моих клиентов (я управляю студией звукозаписи) загружал миксы или аудиофайлы в целом из своей защищенной паролем папки, не щелкая каждый файл, захватывая их все сразу в zip-архиве. index.php генерирует список html и ссылки для скачивания файлов в этой папке.   -  person brunogermain    schedule 30.10.2015


Ответы (2)


Ваш последний заголовок неверен:

header("Location: /zip/$zipname");

Так должно быть :

header("Location: /zip/".$zipname);

Поскольку ваше $zipname является переменной, а не строкой

person Nirnae    schedule 30.10.2015
comment
это не работает. он указывает на www.mydomain.com/zip/:D\mypath\foldername.zip, конечно, там ничего нет... - person brunogermain; 30.10.2015
comment
Можете сбросить $zipname ? Почти уверен, что вы не вырезали путь из getcwd(), как я говорил вам в другом посте. - person Nirnae; 30.10.2015
comment
если я добавлю строку strip_out, загрузка будет работать нормально, но имя файла будет просто .zip - person brunogermain; 30.10.2015
comment
Мой плохой, я сделал ошибку в своем другом посте и поставил «/» вместо «\», а также перепутал имя var, я отредактировал его сейчас, он должен работать лучше (так как я проверил это на этот раз): stackoverflow.com/questions/33431590/ - person Nirnae; 30.10.2015
comment
Вы должны переключить решенную отметку на мой ответ, иначе это может сбить с толку других людей с той же проблемой;) - person Nirnae; 30.10.2015
comment
@Nirnae Этот ответ не имеет никакого смысла. Строка — это переменная. Две вещи, которые вы разместили, работают точно так же. Двойные кавычки интерполируют переменную. - person Rimble; 30.10.2015

Пытаться

header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="'.basename($zipname).'"');
header('Content-Length: ' . filesize($zipname));
header('Location: /zip/'.$zipname);
person Salah    schedule 30.10.2015