Ситуация достаточно проста, мой клиент в панели администратора загружает zip-архив, который я храню в подпапке AWS S3 bucket. В какой-то момент жизненного цикла записи, с которой связан zip-архив, они нажимают кнопку «Опубликовать» содержимое. Я надеюсь прочитать Zip архив из S3 в память, перебрать файлы в памяти и сделать то, что мне нужно, с содержимым, найденным внутри.
Моя проблема в том, что я не могу найти правильное решение для чтения zip-архива в память из S3.
До сих пор я пытался использовать ZipArchive, в соответствии с этими документами, который потерпел неудачу
$zip = new \ZipArchive();
$zip->open($s3path);
dump($zip); // Symfony\Component\VarDumper::VarDumper function
дает мне
ZipArchive {#1875 ▼
+status: 0
+statusSys: 0
+numFiles: 0
+filename: ""+comment: ""}
что дико неверно
Я также пытался Splitbrain \ PHP-архив
$zip = new \splitbrain\PHPArchive\Zip();
$zip->open($s3path);
$contents = $zip->contents();
который бросает Exception
с сообщением: Warning: filesize(): stat failed for {path}
Затем я попытался включить AWSStreamWrapper в соответствие с этими документами и изменил $s3path
использовать s3://
схема в правильное местоположение
$s3Client->registerStreamWrapper();
$zip = new \splitbrain\PHPArchive\Zip();
$zip->open($s3path);
$contents = $zip->contents();
Который производит Exception
что говорит: Warning: unpack(): Type v: not enough input, need 2, have 0
Затем я попытался использовать стандарт \ZipArchive
Класс снова с включенной потоковой оболочкой, но я получаю ту же пустую проблему «0 файлов», как и раньше.
Затем я использовал s3sdk для чтения необработанного содержимого zip
$archive = $s3client->getObject([
'Bucket' => $bucket,
'Key' => $s3path
]);
и это дает мне Guzzle\Psr7\Stream
объект, и на данный момент я просто понятия не имею, что еще с ним делать. Кажется, что ни одна из функций или классов PHP Zip не позволяет мне использовать необработанный ввод или обработчик файлового потока.
И теперь у меня заканчиваются идеи ..
Какие-либо предложения?
РЕДАКТИРОВАТЬ
Я увидел предложение, в котором говорится сохранить содержимое удаленного файла Zip в локальной файловой системе, а затем просто прочитать его. Так я и сделал, используя s3sdk getObject
метод с SaveAs
атрибут, а затем использовал класс Zip splitbrain, чтобы прочитать его. Это сработало.
Тем не менее, я не хочу жонглировать файлами, если этого вообще можно избежать. Я предпочел бы просто читать удаленно и вызывать функцию синтаксического анализатора raw или переходить в класс zip, который может читать необработанный файл из памяти.
Используйте file_get_contents ()
Для вашего случая это будет выглядеть так:
$result = file_get_contents("zip://http://$s3path");
Других решений пока нет …