PHP rocks! wünscht allen Mitgliedern einen guten Rutsch ins neue Jahr 2017 !!!
Hinweis: Das Forum zieht um! Um keine Datenverluste zu haben, schalten wir zwecks Übernahme der Daten das Forum am Sonntag, den 24.04.2016 um ca. 21:00 Uhr offline und passen anschliessend die DNS-Einträge an.
www.php-rocks.de wird euch dann nach den Aktualisierungen der DNS-Server wieder wie gewohnt uneingeschränkt zur Verfügung stehen.
Danke für euer Verständnis!

Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
"archive is corrupted or damaged" (.zip Archive)
#1
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...?
Antworten
#2
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
Antworten
#3
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
Antworten
#4
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
Antworten
#5
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?


Angehängte Dateien
.zip   wigetcd82bc267929f96922a725179e7556dd8bdac490widget.zip (Größe: 4,09 KB / Downloads: 2)
.zip   wcd82bc267929f96922a725179e7556dd8bdac490widget.zip (Größe: 9,3 KB / Downloads: 1)
Antworten
#6
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
Antworten
#7
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
Antworten
#8
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
Antworten


Gehe zu: