使用php从Amazon s3压缩和下载文件

时间:2014-10-06 20:34:02

标签: php amazon-web-services amazon-s3 zip

我正在使用托管在Amazon Elastic Beanstalk上的php创建我的第一个Web应用程序,而且我有点想知道该怎么做。我的任务是在AWS S3云中联系最终客户指定的文件,将其压缩,最后提供到生成的zip文件的下载链接。我已经做了很多狩猎,找到了我正在尝试做什么的实例,但是我对PHP的经验不足以确定某个解决方案是否对我有用。

我发现了这个问题和回复here,并且看到它似乎解决了一般意义上的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;
        });
    });

现在每当我点击下载按钮时,我都会得到一个“开始拉链测试”的回声。没有错误,也没有zip文件。我需要知道什么或我做错了什么?

提前感谢您的帮助和建议。

编辑: 经过德里克的一些建议,这就是我所拥有的。这仍然会产生一个令人讨厌的二进制字符串。

<?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);
?>

1 个答案:

答案 0 :(得分:4)

Marc B的评论是正确的。对zip的调用不知道s3://是什么意思。

您需要从S3下载文件,然后在本地压缩。您有几个从S3下载文件的选项。例如,您可以使用:

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

获取对象的网址,然后使用cUrl或wget从该网址下载,具体取决于您的权限设置。

在本地获得文件后,使用保存文件的位置更新zip命令,以生成.zip文件。