Как сохранить извлеченный файл почтового индекса с определенным именем файла - PullRequest
1 голос
/ 30 июня 2019

У меня есть zip-файлы только с одним файлом, но каждый раз у него новое имя. Мне нужно извлечь файл и сохранить его с конкретным именем файла , а не извлеченным.

  $zip = new ZipArchive;
  $res = $zip->open($tmp_name);
  if ($res === TRUE) {

   $path = _PATH."/files/";
   $zip->extractTo($path);
   $zip->close();
   echo 'Unzip!';
  }

Abowe код работает, но мне нужно конкретное имя файла. Например, любой файл, расположенный под zip (например, pricelist025.xml должен иметь имя temp.xml

1 Ответ

1 голос
/ 30 июня 2019

Переименуйте ваш конкретный файл перед его извлечением.

$zip = new ZipArchive;
$res = $zip->open($tmp_name);

if ($res === TRUE) {       
    $zip->renameName('pricelist025.xml','temp.xml');
    $path = _PATH."/files/";
    $zip->extractTo($path);
    $zip->close();
    echo 'Unzip!';
    } else {
             echo 'failed, code:' . $res;
       }

Надеюсь, это сработает.
ОБНОВЛЕНИЕ 1

Есть два варианта, если вы хотитеизменить имена файлов.
1. изменить имена файлов перед извлечением - Таким образом, zip-файлы будут изменены
2. изменить имена файлов после извлечения - Zip-файлы останутсякак и раньше

Изменение имен файлов перед извлечением

Мы должны определить шаблон для имен файлов.
Здесь,Файлы будут в этом шаблоне: myfile0.xml, myfile1.html, adn so on..
Примечание: расширение будет сохранено.

$zip = new ZipArchive;
$res = $zip->open('hello.zip');

$newfilename = 'myfile';
for($i=0;$i<$zip->count();$i++)
{ 
   $extension = pathinfo($zip->getNameIndex($i))['extension'];
   $zip->renameName($zip->getNameIndex($i), $newfilename.$i.'.'.$extension);

 }

Изменение имен файлов после извлечения

Имена файлов будут в том же порядке, что и выше.

$directory = 'hello/'; //your extracted directory
$newfilename = 'myfile';

foreach (glob($directory."*.*") as $index=>$filename) {

      $basename = pathinfo($filename)['basename'];


      if(!preg_match('/myfile\d\./', $basename)) {

                $extension = pathinfo($filename)['extension'];

                rename($filename,$newfilename.$index.'.'.$extension);
                }
      }

Что мы здесь сканируем все файлы из извлеченного каталога, для которого нет имени файла вскороговорка myfile[num]. и затем мы меняем его имя.

ОБНОВЛЕНИЕ 2

Я просто неiced, вы обновили свой вопрос.
Поскольку у вас есть только один файл, и вы хотите извлекать его каждый раз под другим именем.
Вы должны переименовывать его каждый раз, когда извлекаете.

$zip = new ZipArchive;
$newfilename = "myfile".rand(1,999); //you can define any safe pattern here that suites you

if($zip->open('help.zip')===TRUE)
{
    $path = '/your/path/to/directory';

    $filename = $zip->getNameIndex(0);


    if($zip->extractTo($path))
    {
        echo "Extracted";
     }else{
           echo "Extraction Failed";
        exit();
     }

     $extension = pathinfo($filename)['extension'];

     rename($path."/$filename",$path."/$newfilename".'.'.$extension);

     echo "Extracted with different name successfully!";

  } else {  
        echo "Failed";
  }
...