PHP将远程映像保存到Amazon S3

时间:2011-11-02 22:37:49

标签: php amazon-s3 amazon

有没有办法使用URL抓取图像并将其直接保存到亚马逊?

使用PHP?

我的另一个选择是在本地保存文件并使用S3 PHP类发送它。

3 个答案:

答案 0 :(得分:5)

当您“抓取图像”时,您将至少必须在本地将其写入临时文件。这是因为无论您使用fopen()还是curl来访问该文件,您都需要一些方法将流写入Amazon。我不确定如何编写基本上将远程文件直接连接到S3的流。事实上,理论上不可能,因为S3无法执行脚本,图像无法运行脚本。

如果您希望最大限度地减少存储在内存中的信息量,可以通过某种形式的流缓冲区加载图像,但将其写入临时文件应该是最简单的事情。如果由于系统中有这么多用户而导致空间不足,则可以升级到大型服务器或在负载均衡器下添加其他服务器。就个人而言,我在我的系统上使用亚马逊的S3 PHP类,并使用类似这样的脚本将其从本地文件直接移动到S3:

function upload_image( $image_data )
{
    //
    // Write the image to S3
    //  
    $s3 = new AmazonS3();
    $bucket = ACTIVITY_S3_BUCKET;
    $image_id = uniqid('myscript');
    $path = ACTIVITY_S3_FOLDER.'/'.$image_id;
    $response = $s3->create_object($bucket, $path, array(
        'body'  => $image_data,
        'acl'   =>  AmazonS3::ACL_PUBLIC
    ));
    $image_url = 'https://s3.amazonaws.com/'.ACTIVITY_S3_BUCKET.'/'.$path;
    return $image_id;
}

显然,这不是一个强大的脚本,但我想我只是分享了自己走下去的道路。我应该补充一点,因为在这种情况下你的主要关注点似乎是处理能力,请查看这篇关于调整云中数十亿图像大小的有趣帖子。 http://www.nslms.com/2010/11/01/how-to-resize-billions-of-images-in-the-cloud/

<强>更新 根据这个答案How best to resize images off-server“PHP / GD让你直接在http响应中发送jpeg。”

答案 1 :(得分:1)

您可以使用Amazon S3 Stream Wrapper将远程文件直接保存到S3。无需在服务器上保存临时副本。

// Register the stream wrapper from an S3Client object
$client->registerStreamWrapper();

// Copy a remote file to Amazon S3
copy('http://example.com/1.jpg', 's3://bucket/key');

它还允许您使用内置PHP函数(例如file_get_contentsfopencopyrename,{{1}来存储和检索来自Amazon S3的数据},unlinkmkdir

答案 2 :(得分:0)

当然,您可以将图像上传到服务器,然后将其传输到Amazon S3服务。但是,我认为,最好让客户端使用以下形式将图像直接上传到S3:

<form action="https://s3-bucket.s3.amazonaws.com/" method="post" enctype="multipart/form-data">
    <input type="hidden" name="key" value="uploads/${filename}">
    <input type="hidden" name="AWSAccessKeyId" value="YOUR_AWS_ACCESS_KEY"> 
    <input type="hidden" name="acl" value="private"> 
    <input type="hidden" name="success_action_redirect" value="http://localhost/">
    <input type="hidden" name="policy" value="YOUR_POLICY_DOCUMENT_BASE64_ENCODED">
    <input type="hidden" name="signature" value="YOUR_CALCULATED_SIGNATURE">
    <input type="hidden" name="Content-Type" value="image/jpeg">
    File to upload to S3: 
    <input name="file" type="file"> 
    <br> 
    <input type="submit" value="Upload File to S3"> 
</form> 

您可以在官方文档中找到详细信息: http://aws.amazon.com/articles/1434