Zip и загрузка файлов из Amazon s3 с переполнением стека

Я создаю свое первое веб-приложение, используя php, размещенный на Amazon Elastic Beanstalk, и я немного разбираюсь в том, что делать. Моя задача — обратиться к файлам, указанным конечным пользователем в облаке AWS S3, сжать их и, наконец, предоставить ссылку для загрузки получающегося zip-файла. Я много охотился вокруг, чтобы найти пример того, что именно я пытаюсь сделать, но моя неопытность с php была препятствием для определения того, подойдет ли мне какое-то решение.

Я нашел этот вопрос и ответ Вот, и, видя, что это похоже на загрузку php и zip в общем смысле, я подумал, что смогу адаптировать его к своим потребностям. Вот что я имею в php:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

require "./aws.phar";
use Aws\S3\S3Client;

$client = S3Client::factory(array(
'key'    => getenv("AWS_ACCESS_KEY_ID"),
'secret' => getenv("AWS_SECRET_KEY")
));

echo "Starting zip test";

$client->registerStreamWrapper();

// make sure to send all headers first
// Content-Type is the most important one (probably)
//
header('Content-Type: application/octet-stream');
header('Content-disposition: attachment; filename="file.zip"');

// use popen to execute a unix command pipeline
// and grab the stdout as a php stream
// (you can use proc_open instead if you need to
// control the input of the pipeline too)
//
$fp = popen('zip -r - s3://myBucket/test.txt s3://myBucket/img.png', 'r');

// pick a bufsize that makes you happy (8192 has been suggested).
$bufsize = 8192;
$buff = '';
while( !feof($fp) ) {
$buff = fread($fp, $bufsize);
echo $buff;
}
pclose($fp);

И вот что я использую, чтобы назвать это:

$(document).ready(function() {
$("#download_button").click(function() {
$.get("../php/ZipAndDownload.php", function(data){alert(data)});
return false;
});
});

Я также попробовал:

$(document).ready(function() {
$("#download_button").click(function() {
$.ajax({
url:url,
type:"GET",
complete: function (response) {
$('#output').html(response.responseText);
},
error: function () {
$('#output').html('Bummer: there was an error!');
}
});
return false;
});
});

Теперь всякий раз, когда я нажимаю кнопку загрузки, я получаю эхо «Starting zip test» и ничего больше. Нет ошибок и нет почтового файла. Что мне нужно знать или что я делаю явно неправильно?

Заранее благодарю за помощь и совет.

РЕДАКТИРОВАТЬ:
Вот что я получил после некоторых советов от Дерека. Это все еще производит большую неприятную строку двоичного файла.

<?php
header('Content-Type: application/octet-stream');
header('Content-disposition: attachment; filename="file.zip"');

require "./aws.phar";
use Aws\S3\S3Client;

$bucket = 'myBucket';

$client = S3Client::factory(array(
'key'    => getenv('AWS_ACCESS_KEY_ID'),
'secret' => getenv('AWS_SECRET_KEY')
));

$result = $client->getObject(array(
'Bucket' => $bucket,
'Key'    => 'test.txt',
'SaveAs' => '/tmp/test.txt'
));

$Uri = $result['Body']->getUri();

$fp = popen('zip -r - '.$Uri, 'r');

$bufsize = 8192;
$buff = '';
while( !feof($fp) ) {
$buff = fread($fp, $bufsize);
echo $buff;
}
pclose($fp);
?>

4

Решение

Комментарий Марка Б правильный. Вызов zip не знает, что означает s3: //.

Вам нужно будет скачать файл с S3, а затем архивировать его локально. У вас есть несколько вариантов загрузки файла из S3. Например, вы можете использовать:

$client->getObjectUrl($bucket, $key)

чтобы получить URL для вашего объекта, затем используйте cUrl или wget для загрузки с этого URL, в зависимости от ваших настроек разрешений.

Как только вы получите файл локально, обновите команду zip, указав расположение, в котором вы сохранили файл, чтобы создать файл .zip.

4

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

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

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