2015-09-11 6 views
1

Привет всем, я пару дней пытаюсь решить проблему без ответа, я не преуспеваю в php, но я делаю все возможное.Zip inside zip (php)

Я хочу поставить automatially для загрузки, и без сохранения на сервере почтовый называется Bigzip

Внутри Bigzip: -Еще молния называется Smallzip

Но я получаю сообщение об ошибке при открытии загруженный ZIP, это является поврежден

<?php 

//Big and Small Archives names 
$BzipN='Bigzip.zip'; 
$SzipN='Smallzip.zip'; 

//Big and Small Archives 
$Bzip = new ZipArchive(); 
$Szip = new ZipArchive(); 




//File path 
$file_path=$_SERVER['DOCUMENT_ROOT'].'/PF/'; 




zipFilesAndDownload($BzipN,$SzipN,$Bzip,$Szip,$file_path); 

function zipFilesAndDownload($BzipN,$SzipN,$Bzip,$Szip,$file_path) 
{ 


//create the file and throw the error if unsuccessful 
if ($Bzip->open($BzipN, ZIPARCHIVE::CREATE)!==TRUE) { 
exit("cannot open <$BzipN>\n"); 
} 
if ($Szip->open($SzipN, ZIPARCHIVE::CREATE)!==TRUE) { 
exit("cannot open <$SzipN>\n"); 
} 



//Add Smallzip to BigZip 
$Bzip->addFile($file_path.$SzipN,$Szip); 


$Szip->close(); 
$Bzip->close(); 
//then send the headers to foce download the Big zip file 
header("Content-type: application/zip"); 
header("Content-Disposition: attachment; filename=$BzipN"); 
header("Content-length: " . filesize($BzipN)); 
header("Pragma: no-cache"); 
header("Expires: 0"); 
readfile("$BzipN"); 
exit; 
} 
?> 

Если у вас есть какие-либо альтернативные варианты, идеи, предложения я gladely принять его.

Благодаря

+0

Убедитесь Htaccess не мешая: 'SetEnvIfNoCase REQUEST_URI \ (?: GIF | JPE г | PNG | застежка-молния?) $ Не-GZIP Dont-не меняется. ' – ScottMcGready

+1

@ScottMcGready Его код был просто испорчен. – icecub

ответ

1

Выпуск номер 1:
Вы не можете создавать пустые zip-архивы в пустых архивах zip. Это приведет к повреждению файла.

Выпуск № 2:
Не пытайтесь добавить почтовый архив на другой почтовый архив, а вы даже не закрыли первый еще.

Номер выпуска 3:
$Bzip->addFile($file_path.$SzipN,$Szip); Так почему именно вы пытаетесь установить объект как ваше имя файла? =>$Szip = new ZipArchive();

Решение:

<?php 

//Big and Small Archives names 
$BzipN='Bigzip.zip'; 
$SzipN='Smallzip.zip'; 

//Big and Small Archives 
$Bzip = new ZipArchive(); 
$Szip = new ZipArchive(); 

//File path 
$file_path=$_SERVER['DOCUMENT_ROOT'].'/PF/'; 


function zipFilesAndDownload($BzipN,$SzipN,$Bzip,$Szip,$file_path){ 
    // Create the file Smallzip.zip and throw the error if unsuccessful 
    if ($Szip->open($SzipN, ZIPARCHIVE::CREATE)!==TRUE) { 
     exit("cannot open <$SzipN>\n"); 
    } 

    // Add a txt file to Smallzip so it isn't empty 
    $Szip->addFromString("testfilephp.txt", "#1 This is a test string added as testfilephp.txt.\n"); 

    // Close Smallzip.zip as we're done with it 
    $Szip->close(); 

    // Create the file Bigzip.zip and throw the error if unsuccessful 
    if ($Bzip->open($BzipN, ZIPARCHIVE::CREATE)!==TRUE) { 
     exit("cannot open <$BzipN>\n"); 
    } 

    // Add Smallzip.zip to Bigzip.zip with a valid name 
    $Bzip->addFile($file_path.$SzipN,$SzipN); 

    // Close Bigzip.zip as we're done with it 
    $Bzip->close(); 

    //then send the headers to foce download the Big zip file 
    header("Content-type: application/zip"); 
    header("Content-Disposition: attachment; filename=$BzipN"); 
    header("Content-length: " . filesize($BzipN)); 
    header("Pragma: no-cache"); 
    header("Expires: 0"); 
    readfile("$BzipN"); 

    // Delete the files from the server, even if the user cancels the download 
    ignore_user_abort(true); 
    unlink($file_path.$SzipN); 
    unlink($file_path.$SzipN); 
    exit; 
} 

zipFilesAndDownload($BzipN,$SzipN,$Bzip,$Szip,$file_path); 

?> 
+0

Большое спасибо за ваш ответ, я очень ценю это. С другой стороны, он сохраняет файлы на сервере, не так ли? – KPXD

+0

Потому что я не хочу сэкономить на сервере – KPXD

+0

@KPXD Нет проблем. Все дело в тщательной отладке вашего кода и замечении чего-то странного, а также логического мышления. Он сохраняет файл на сервере, потому что вы создаете файл. Это не так. Но вы можете просто просто удалить файл после этого. – icecub

-1

Если и не хотят, чтобы сохранить файл на сервере только эхо созданного файла. index.php

<form action="test.php" method="post"> 
 
To file: <input type="text" name="tofile" /> 
 
<input type="submit" /> 
 
</form>

test.php

<?php 
 
$filename = 'test-download.zip'; 
 
$htmlcode1 = "<HTML> \n <BODY>"; 
 
$htmlcode2 = "</BODY> \n <HTML>"; 
 
$somecontent = $htmlcode1.$_POST["tofile"].$htmlcode2; 
 
!$handle = fopen($filename, 'w'); 
 
fwrite($handle, $somecontent); 
 
fclose($handle); 
 

 

 
header("Cache-Control: public"); 
 
header("Content-Description: File Transfer"); 
 
header("Content-Length: ". filesize("$filename").";"); 
 
header("Content-Disposition: attachment; filename=$filename"); 
 
header("Content-Type: application/octet-stream; "); 
 
header("Content-Transfer-Encoding: binary"); 
 

 
readfile($filename); 
 

 
?>

+1

Итак, что именно это связано с zip-архивами и причиной того, что его zip-архив был поврежден? – icecub