Скачать архив созданный ZipArchive

P
На сайте с 18.09.2015
Offline
63
1217

Привет!

Ребята не получается скачать архив, который я создаю библиотекой ZipArchive.

1. Архив создается на сервере.

2. В архиве есть файлы.

3. Архив открывается на сервере.

4. Скачивается архив весом 2кБ.

Вот код:


public function download_file(){
$zip = new ZipArchive;
$name = time().".zip";
if($zip->open("../archive/".$name,ZIPARCHIVE::CREATE) === true){
$folder = opendir($this->folder_out);
while($file = readdir($folder)){
if(strpos($file,$_COOKIE['hash'])){
$zip->addFile($this->folder_out.$file,$file);
}
}
$zip->close;
closedir($folder);

header("Content-type: application/zip");
/*header ("Content-Type: application/octet-stream");
header ("Accept-Ranges: bytes");*/

header("Content-Disposition: attachment; filename=".$name."");
header("Content-Length: ".filesize($name)."");

readfile($name);
unlink($name);
}
}

Пробовал разные заголовки, проверил на создание и добавление файлов... Все ок.... А скачиваться не хочет :mad:

ДП
На сайте с 23.11.2009
Offline
203
#1

вот здесь попробуйте полный путь к файлу указать

header("Content-Length: ".filesize($name)."");

Не совсем понял, вы смотрели сам файл, который генерируется (не удаляли его) и скачивали его по фтп для проверки?

P
На сайте с 18.09.2015
Offline
63
#2
Дикий пионер:
вот здесь попробуйте полный путь к файлу указать
header("Content-Length: ".filesize($name)."");
Не совсем понял, вы смотрели сам файл, который генерируется (не удаляли его) и скачивали его по фтп для проверки?

Файл скачивается по прямой ссылке :

header("Location:http://".$_SERVER['SERVER_NAME']."/archive/".$name);

Но это дикость, мне кажется.

Прописал как вы сказали, результат такой же:

header("Content-Length: ".filesize("http://".$_SERVER['SERVER_NAME']."/archive/".$name)."");
tommy-gung
На сайте с 22.11.2006
Offline
304
#3

после

closedir($folder); 

добавь


$name = "../archive/".$name;
Здесь не могла быть ваша реклама
P
На сайте с 18.09.2015
Offline
63
#4
tommy-gung:
после
closedir($folder); 

добавь


$name = "../archive/".$name;

Скачался файл - "-archive-1478170370.zip" весом 2 кБ.

Самое интересное, что я не могу найти файл через file_exists().

Причем пробовал прописать самые разные пути... "../archive", "/archive", "archive/", "$_SERVER['HTTP_HOST']/archive/","$_SERVER['DOCUMENT_ROOT']."/archive/" . Везде файл не найден.

Также не удаляет через unlink(), наверно поэтому не читает через readfile(). И получаю 2 кб.

Функция вызывается с файла func.php, который находится в папке func.

Сам скрипт находится в файле class.php, в папке class.

>корень

>>archive

>>class

>>func

....

ДП
На сайте с 23.11.2009
Offline
203
#5

Используй константу __DIR__ и от неё остальные пути задавай, чтобы не путаться.

S
На сайте с 30.09.2016
Offline
469
#6
posy:
Файл скачивается по прямой ссылке :
header("Location:http://".$_SERVER['SERVER_NAME']."/archive/".$name);

posy:
Везде файл не найден.
Чёй-то я совсем запутался: есть там где-нибудь файл или нету его?
Функция вызывается с файла func.php, который находится в папке func.
Сам скрипт находится в файле class.php, в папке class.
Да пофиг, где что находится и откуда вызывается. Имеет значение адрес, по которому находится родительский скрипт, который подключает всё остальное.

ЗЫ: И поосторожнее там с header(). Если какие-то заголовки уже отправлены, то не сработает.

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
W
На сайте с 09.04.2013
Offline
46
#7

  if(strpos($file,$_COOKIE['hash']){ 

$zip->addFile($this->folder_out.$file,$file);
}

Куки не чистили?

Из документации http://php.net/manual/ru/function.readdir.php


/* Именно этот способ чтения элементов каталога является правильным. */
while (false !== ($entry = readdir($handle))) {
echo "$entry\n";
}

/* Это НЕВЕРНЫЙ способ обхода каталога. */
while ($entry = readdir($handle)) {
echo "$entry\n";
}
P
На сайте с 18.09.2015
Offline
63
#8
Sitealert:
Чёй-то я совсем запутался: есть там где-нибудь файл или нету его?Да пофиг, где что находится и откуда вызывается. Имеет значение адрес, по которому находится родительский скрипт, который подключает всё остальное.
ЗЫ: И поосторожнее там с header(). Если какие-то заголовки уже отправлены, то не сработает.

Архив с файлами создается, но не качается никак кроме как прямое обращение к ссылкею

Я не могу прочитать файл readfile(), чтобы отправить его.

---------- Добавлено 07.11.2016 в 11:35 ----------

webjey:
  if(strpos($file,$_COOKIE['hash']){ 

$zip->addFile($this->folder_out.$file,$file);
}

Куки не чистили?

Из документации http://php.net/manual/ru/function.readdir.php


/* Именно этот способ чтения элементов каталога является правильным. */
while (false !== ($entry = readdir($handle))) {
echo "$entry\n";
}

/* Это НЕВЕРНЫЙ способ обхода каталога. */
while ($entry = readdir($handle)) {
echo "$entry\n";
}

Спасибо! поправил!

Понятно, когда я запрашиваю файл его еще нет на сервере....


../archive/1478509555.zip

array(43) {
[0]=>
string(1) "."
[1]=>
string(2) ".."

string(14) "1478509081.zip"
[34]=>
string(14) "1478509271.zip"
[35]=>
string(14) "1478509308.zip"
[36]=>
string(14) "1478509355.zip"
[37]=>
string(14) "1478509385.zip"
[38]=>
string(14) "1478509398.zip"
[39]=>
string(14) "1478509408.zip"
[40]=>
string(14) "1478509437.zip"
[41]=>
string(14) "1478509476.zip"
[42]=>
string(14) "1478509488.zip"
}

Вот она ошибка.... И никто не заметил....... Блииин столько времени!!!!!!! Надо вызывать функцию, а не переменную :)

надо писать не

$zip->close;
, а
$zip->close();

Архив закрывался по умолчанию в конце файла....

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий