Maison  >  Questions et réponses  >  le corps du texte

Comportement étrange lors de la tentative d'extraction d'un fichier zip dans un conteneur Docker à l'aide de Laravel

J'essaie d'extraire une archive zip dans une application conteneur Docker exécutant Laravel 9 sur PHP 8.1.7 et j'obtiens une erreur étrange.

Donc, si vous essayez ce code dans le contrôleur

$zip = new ZipArchive();
    $result = $zip->open("/var/www/html/public/my_archive.zip");
    if ($result === TRUE) {
        $zip->extractTo("/var/www/html/public/my_folder");
    }
    $zip->close();

Les fichiers de l'archive sont extraits correctement, mais cette erreur est renvoyée :

Exception d'erreur ZipArchive::extractTo(/var/www/html/public/my_folder/my_file.xml) : Échec de l'opération : Opération non autorisée

Si j'exécute le même code dans php artisantinker, cela fonctionne.

Quelqu'un a-t-il une solution à ce problème ?

Cela ne semble pas être un problème lié aux autorisations , le dossier est créé avec 777 autorisations et les fichiers sont copiés correctement.

Modifier

root@5899a5badc45:/var/www/html/public/my_folder# ls -lhart *
  -rwxrwxrwx 1 1000 1000 1.3K Oct 25 12:24 phpunit.xml

Merci

P粉665679053P粉665679053309 Il y a quelques jours542

répondre à tous(1)je répondrai

  • P粉668804228

    P粉6688042282024-01-08 10:09:20

    J'ai eu exactement le même problème. De mon côté, j'ai rencontré ce problème car j'extrayais des fichiers du répertoire de mon installation Windows.

    Je veux dire /var//html/public/my_folder/mnt/dev/my_folder 的符号链接,来自 Windows (C:例如 devmy_folder).

    Étant donné que le système de fichiers est différent de Linux et Windows, il semble que quelque chose de spécifique dans la classe ZipArchive soit à l'origine de cette erreur.

    J'ai résolu ce problème en extrayant /tmp/my_folder 中的文件然后将其移动到 /var//html/public/my_folder.

    $zip = new ZipArchive();
    $res = $zip->open($filename);
    
    if ($res === true) {
      $temp = '/tmp/my_folder';
      mkdir($temp, 0777, true);
    
      $zip->extractTo($temp);
      $zip->close();
    
      rename($temp, '/var/html/public/my_folder');
    } else {
      echo 'Failed to open the zip file.';
    }

    J'espère que cela vous aidera.

    répondre
    0
  • Annulerrépondre