PHP Rocks
"archive is corrupted or damaged" (.zip Archive) - Druckversion

+- PHP Rocks (https://www.php-rocks.de)
+-- Forum: PHP Programmierung (https://www.php-rocks.de/https://www.php-rocks.de/forum/1-php-programmierung.html)
+--- Forum: PHP Basics (https://www.php-rocks.de/https://www.php-rocks.de/forum/2-php-basics.html)
+--- Thema: "archive is corrupted or damaged" (.zip Archive) (/https://www.php-rocks.de/thema/82--archive-is-corrupted-or-damaged-zip-archive-.html)



"archive is corrupted or damaged" (.zip Archive) - Till - 18.01.2016

Ich habe auch die auskommentierten Varianten durchgetestet und mit Content type "application/zip"...?
PHP-Code:
/*
 ZipFile::zipDir($dir, $outZipPath);
*/
if(!file_exists($outZipPath) || filemtime($outZipPath) < time() - 60){
 
 $phar = new \PharData($outZipPath);
 
// add all files in the folder, only include files with extensions
 
$phar->startBuffering();
 
$phar->buildFromDirectory($dir);
 
$phar->stopBuffering();
 
}
 
sleep(1);

header('Content-Description: File Transfer');
header('Content-Transfer-Encoding: binary');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename="  $outZipPathFile.'.wgt');
header("Pragma: no-cache");
header("Expires: 0");
header('Content-Length: ' filesize($outZipPath));
 
 
/*
 readfile($outZipPath);
 */
 
 $headers headers_list();
 
 $options = array();
 
 $options['headers'] = array();

 
 
    foreach 
($headers as $hdr) {
 
       $h explode(':'$hdr2);
 
       $options['headers'][$h[0]]=$h[1];
 
   }
 
   
  self
::getInstance()->serveStaticFile($outZipPath$options); 
 
 
 return
Edit: ZipFile ist nur ein Wrapper für ZipArchive (php-extension)

EDIT2: Moment, ich habe keine Extensions angegeben und inkludiere das Directory(Eintrag) irgendwie kann das sein...?


RE: "archive is corrupted or damaged" (.zip Archive) - Arne Drews - 18.01.2016

Hi Till,

An den Extensions kann es nicht liegen, der zweite Parameter von PharData::buildFromDirectory() ist optional.
Er müsste in Deinem Fall den kompletten Inhalt des angegebenen Directory greifen.

Ich bin nicht sicher, frage aber mal, ob es an der Endung .wgt liegt?

Wobei mir auch grad auffällt, daß Du die für den filename $outZipPathFile verwendest und für Content-Length $outZipPath.
Ist das so korrekt?

Ansonsten vielleicht mal mit minimaler header()-Modifizierung testen:
PHP-Code:
header'Content-Type: application/zip' ); // "application/octet-stream" sollte imho aber auch gehen
header'Content-Disposition: attachment; filename=' basename($outZipPathFile) );
header'Content-Length: ' filesize($outZipPathFile) ); 

Gruß Arne


RE: "archive is corrupted or damaged" (.zip Archive) - Till - 19.01.2016

Hallo Arne,
Zitat:Wobei mir auch grad auffällt, daß Du die für den filename $outZipPathFile verwendest und für Content-Length $outZipPath.
Ist das so korrekt?
Eigentlich schon, $outZipPath ist der tatsächliche lokale Pfad und $outZipPathFile ist nur der Dateiname welcher mitgegeben werden soll.
Ich habe mal wie folgt geändert:
PHP-Code:
header('Content-Description: File Transfer');
header('Content-Transfer-Encoding: binary');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header("Content-type: application/zip");
header("Content-Disposition: attachment; filename=" .  basename($outZipPath));
header("Pragma: no-cache");
header("Expires: 0");
header('Content-Length: ' filesize($outZipPath)); 
Leider das gleiche Ergebniss: "Der Order kann nicht geöffnet werden... ist ungültig". (Windows 8.1)

Mit Win.rar kann ich zumindest den Ordner öfnnen und die Dateien sehen, will ich aber extraieren kommt die Fehlermeldung.

Viele Grüße
Till


RE: "archive is corrupted or damaged" (.zip Archive) - Arne Drews - 19.01.2016

Hi Till,

Kann es an den Dateien innerhalb des Verzeichnisses liegen?
PharData kann imho nicht so gut mit ungültigen Dateinamen um ( Leerzeichen, Umlaute, Sonderzeichen, etc. ).

Evtl. ErrorReport aufdrehen, vielleicht sagt er dann, was ihn stört.

Bei mir klappt es einwandfrei so:
PHP-Code:
$sSourceFolder __DIR__ '/folder/';
$sTargetPath $sSourceFolder 'tillphar.zip';

$oPhar = new PharData$sTargetPath );
$oPhar->startBuffering();
$oPhar->buildFromDirectory$sSourceFolder );
$oPhar->stopBuffering();

header("Content-type: application/zip");
header("Content-Disposition: attachment; filename="  basename($sTargetPath));
header('Content-Length: ' filesize($sTargetPath));


readfile$sTargetPath ); 
Zur Not auf ZipArchive umsteigen?

Gruß Arne


RE: "archive is corrupted or damaged" (.zip Archive) - Till - 19.01.2016

Nunja, ich hatte es ja zunächst mit ZipArchive versucht.
PHP-Code:
 public static function zipDir($sourcePath$outZipPath)
 
 {
 
   $pathInfo pathInfo($sourcePath);
 
   $parentPath $pathInfo['dirname'];
 
   $dirName $pathInfo['basename'];

 
   $z = new \ZipArchive();
 
   $z->open($outZipPath, \ZipArchive::CREATE);
 
   $z->addEmptyDir($dirName);
 
   self::folderToZip($sourcePath$zstrlen("$parentPath/"));
 
   $z->close();
 
  
  
  
  

  private 
static function folderToZip($folder, &$zipFile$exclusiveLength) {
 
   $handle opendir($folder);
 
   while (false !== $f readdir($handle)) {
 
     if ($f != '.' && $f != '..') {
 
       $filePath "$folder/$f";

 
       $localPath substr($filePath$exclusiveLength);
 
       if (is_file($filePath)) {
 
         $zipFile->addFile($filePath$localPath);
 
       } elseif (is_dir($filePath)) {
 
    
          $zipFile
->addEmptyDir($localPath);
 
         self::folderToZip($filePath$zipFile$exclusiveLength);
 
       }
 
     }
 
   }
 
   closedir($handle);
 
 

Ich hätte jetzt gesagt es liegt vielleicht an meinem php, allerdings erstelle ich auf dem gleichen System an anderer Stelle erfolgreich sowohl phar als auch zip Dateien (mit ZipArchive).
Mh...?

Ich habe mal eine  zwei Beispielzip hier angehängt, es sind "ganz  normale" Dateien?
Einmal mit ZipArchive und einmal mit phar.

Edit: Phar scheint nicht so effektiv zu komprimieren wie ZipArchive?


RE: "archive is corrupted or damaged" (.zip Archive) - Arne Drews - 19.01.2016

Die kann ich auch nicht entpacken, gleiche Meldung. Merkwürdig.
Kann ich momentan nichts weiter zu sagen, teste aber selber auch nochmal rum.

Als Hinweis nebenbei: ZiArchive::addGlob() Rolleyes


RE: "archive is corrupted or damaged" (.zip Archive) - Till - 20.01.2016

Es muß an der Übertragung liegen:
Ich habe eine leere dummy.zip per WinRar erstellt und hochgeladen, wenn ich sie dann serve ist sie kaputt (Meldung wie gehabt).

PHP-Code:
copy(__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'dummy.zip'$outZipPath);
//ZipFile::zipDir($dir, $outZipPath); 
sleep(1);
header_remove(); 
header("Content-type: application/zip");
header('Content-Disposition: attachment; filename="dummy.zip"');
header('Content-Length: ' filesize($outZipPath));
readfile($outZipPath); 

So langsam gehen mir die Ideen aus...
Am Zippen solls nicht liegen, ich probiere nochmal die header zu ändern aber allzuviele Möglichkeiten gibts ja nicht mehr...?

Edit: Ich glaube einen unerwünschten Output vor der Ausgabe.

Edit2: Yo, das wars!
Ich hatte vergessen ein "debug-echo" zu entfernen Blush

Danke für Deine Hilfe!!!
---
Dieses Forum gefällt mir, mh, ist ja auch noch ziemlich leer Cool


RE: "archive is corrupted or damaged" (.zip Archive) - Arne Drews - 20.01.2016

Till schrieb:Dieses Forum gefällt mir, mh, ist ja auch noch ziemlich leer Cool
Sag's weiter, villeicht ist dann ja irgendwann mal mehr los hier Big Grin