2017-06-14 1 views
1

Ich erhalte die folgende WarnungPHP ZipArchive Fehler Dateien auf Ubuntu Linux extrahieren unter Windows

PHP Warning: ZipArchive::extractTo(/mnt/c/some/folder\data.json): 
failed to open stream: Invalid argument in /mnt/c/somefile.php on line 54 

Mit diesem Code, jede Zip-Datei Extrahieren des Ubuntu-Subsystem unter Windows mit mit PHP 7.1:

<?php 
class someClass 
{ 
    public static function unzip($fn, $to = null) 
    { 
     $zip = new ZipArchive; 

     if (is_null($to)) { 
      $to = self::dirname($fn) . DIRECTORY_SEPARATOR . self::filename($fn); 
     } 

     if (!is_dir($to)) { 
      self::mkdir($to, 0755, true); 
     } 

     $res = $zip->open($fn); 
     if ($res === true) { 
      $zip->extractTo($to); 
      $zip->close(); 
      return $to; 
     } else { 
      return false; 
     } 
    } 
} 

?> 

Der gleiche Code funktioniert gut unter PHP 7.1 unter Windows und PHP 7.1 unter Linux (CentOS).

+0

_Just einem dummen Punkt: _ Sie setzen '$ ds = DIRECTORY_SEPARATOR;' und verwenden Sie dann '$ ds' nie, aber Sie verwenden' DIRECTORY_SEPARATOR' ?? ? – RiggsFolly

+0

Oh ja, in meinem ursprünglichen Code hatte ich viel mehr Zeug, ich habe die meisten irrelevanten Sachen entfernt, aber ich muss das hier gelassen haben! Bearbeitete meine Antwort und entfernte sie. –

Antwort

0

Das Problem war der Schrägstrich im Zip-Dateinamen.

die folgende Verwendung schien es zu beheben:

<?php 

class someClass 
{ 
    public static function unzip($fn, $to = null) 
    { 
     $zip = new ZipArchive; 
     $ds = DIRECTORY_SEPARATOR; 
     if (is_null($to)) { 
      $to = self::dirname($fn) . $ds . self::filename($fn); 
     } 

     $to = self::slashes($to); 

     if (!is_dir($to)) { 
      self::mkdir($to, 0755, true); 
     } 

     $res = $zip->open($fn); 
     if ($res === true) { 
      for ($i = 0; $i < $zip->numFiles; $i++) { 
       $ifn = self::slashes($zip->getNameIndex($i)); 
       if (!is_dir(self::dirname($to . $ds . $ifn))) { 
        self::mkdir(self::dirname($to . $ds . $ifn), 0755, true); 
       } 

       $fp = $zip->getStream($zip->getNameIndex($i)); 
       $ofp = fopen($to . $ds . $ifn, 'w'); 

       if (!$fp) { 
        throw new \Exception('Unable to extract the file.'); 
       } 

       while (!feof($fp)) { 
        fwrite($ofp, fread($fp, 8192)); 
       } 

       fclose($fp); 
       fclose($ofp); 
      } 
      $zip->close(); 
      return $to; 
     } else { 
      return false; 
     } 
    } 

    public static function slashes($fn) 
    { 
     return str_replace(['\\', '/'], DIRECTORY_SEPARATOR, $fn); 
    } 
?> 
Verwandte Themen