веб-сервисы Amazon — считывание удаленного Zip-файла, хранящегося в памяти s3, в память с помощью PHP 7

Ситуация достаточно проста, мой клиент в панели администратора загружает 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, который может читать необработанный файл из памяти.

0

Решение

Используйте file_get_contents ()
Для вашего случая это будет выглядеть так:

$result = file_get_contents("zip://http://$s3path");
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]