2012-05-22 166 views
6

我想使用PHP SDK将文件从外部URL直接上传到Amazon S3存储桶。我设法用下面的代码来做到这一点:使用PHP SDK将外部文件上传到AWS S3存储桶

$s3 = new AmazonS3(); 
$response = $s3->create_object($bucket, $destination, array(
    'fileUpload' => $source, 
    'length' => remote_filesize($source), 
    'contentType' => 'image/jpeg' 
)); 

当功能remote_filesize如下:

function remote_filesize($url) { 
    ob_start(); 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    curl_setopt($ch, CURLOPT_NOBODY, 1); 
    $ok = curl_exec($ch); 
    curl_close($ch); 
    $head = ob_get_contents(); 
    ob_end_clean(); 
    $regex = '/Content-Length:\s([0-9].+?)\s/'; 
    $count = preg_match($regex, $head, $matches); 
    return isset($matches[1]) ? $matches[1] : "unknown"; 
} 

然而,这将是很好,如果我可以跳过,因为上传到亚马逊时设置的文件大小这将节省我去我自己的服务器之旅。但是如果我删除了在$ s3-> create_object函数中设置'length'属性,我收到一个错误消息,说'无法确定流式上传的流大小。'任何想法如何解决这个问题?

回答

0

你有任何控制远程服务器/主机?如果是这样,你可以设置一个php服务器来查询本地文件并将数据传递给你。

如果没有,你可以使用类似curl的东西来检查标题,就像这样;

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://sstatic.net/so/img/logo.png'); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_exec($ch); 
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); 
var_dump($size); 

这样,您使用的是HEAD请求,而不是下载整个文件 - 你,依旧依赖于远程服务器上发送一个正确的Content-Length头。

+0

我无法控制远程服务器/主机。我已经尝试了建议的方法,但即使它只是要求标题,但它大大减缓了过程。我决定将我的服务器迁移到亚马逊(与存储区在相同的可用区域),现在速度已经到了。 – Bjorn

2

您可以上传的URL文件直接到Amazon S3这样的(我的例子是关于一个jpg图片):

1.从URL转换内容以二进制

$binary = file_get_contents('http://the_url_of_my_image.....'); 

2创建与一个S3对象二进制进入

$s3 = new AmazonS3(); 
$response = $s3->create_object($bucket, $filename, array(
    'body' => $binary, // put the binary in the body 
    'contentType' => 'image/jpeg' 
)); 

就是这样,速度非常快。请享用!

+3

使用file_get_contents,您首先将文件内容移至服务器,然后移至S3,从而不会消除额外的流量 – Bjorn

+1

是的,您是正确的。服务器在发送到S3之前读取数据(额外流量和额外时间)。我以为你有从Url读取数据的麻烦。您是否找到直接向S3发送内容的解决方案?谢谢 –

+0

不幸的是不是 – Bjorn

相关问题