Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP将远程图像保存到AmazonS3_Php_Amazon S3_Amazon - Fatal编程技术网

PHP将远程图像保存到AmazonS3

PHP将远程图像保存到AmazonS3,php,amazon-s3,amazon,Php,Amazon S3,Amazon,有没有办法使用URL抓取图像并直接保存到Amazon 使用PHP 我的另一个选择是在本地保存文件,并使用S3 PHP类将其发送。当您“抓取图像”时,您必须至少在本地将其写入临时文件。这是因为无论您使用fopen()还是curl来访问文件,都需要某种方式将流写入Amazon。我不确定是否有一种方法可以编程一个基本上将远程文件直接连接到S3的流。事实上,这在理论上是不可能的,因为S3不能执行脚本,图像也不能运行脚本 如果希望最小化存储在内存中的信息量,可以通过某种形式的流缓冲区加载图像,但将其写入临

有没有办法使用URL抓取图像并直接保存到Amazon

使用PHP

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

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

如果希望最小化存储在内存中的信息量,可以通过某种形式的流缓冲区加载图像,但将其写入临时文件应该是最简单的事情。如果由于系统中的用户太多而导致空间不足,您可以升级到大型服务器,或者在负载平衡器下添加另一台服务器。就我个人而言,我在我的系统上使用Amazon的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;
}
显然,这不是一个健壮的脚本,但我想我应该分享我自己走过的道路。我应该补充一点,因为在这种情况下,您主要关心的是处理能力,请查看这篇关于调整云中数十亿图像大小的有趣文章

更新
根据这个答案,“PHP/GD允许您在http响应中直接发送jpeg。”

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


要上载到S3的文件:

您可以在官方文档中找到详细信息:

您可以使用将远程文件直接保存到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函数从Amazon S3存储和检索数据,如
file\u get\u contents
fopen
copy
rename
unlink
mkdir
rmdir
,等等,这是我最终选择的路径。下载临时文件,然后上传到亚马逊。谢谢谢谢好主意,但唯一的问题是我不能做任何处理,比如将文件名保存到数据库,并在将其传递到Amazon之前重命名文件。所以我不得不走另一条路。@Scott您可以使用选项设置自定义文件名。在DB中保存文件名怎么样?可以使用JS在表单提交中向服务器发送单独的AJAX请求。无论如何,它应该比上传和传输整个文件更便宜,你同意吗?这对我不起作用。它在第一个参数中需要一个s3://url。