【问题标题】:Upload external file to AWS S3 bucket using PHP SDK使用 PHP SDK 将外部文件上传到 AWS S3 存储桶
【发布时间】:2012-05-28 17:11:15
【问题描述】:

我想使用 PHP 开发工具包将文件从外部 URL 直接上传到 Amazon 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";
}

但是,如果我可以在上传到 Amazon 时跳过设置文件大小,那就太好了,因为这样可以节省我去自己的服务器的时间。但是,如果我删除 $s3->create_object 函数中的“长度”属性设置,我会收到一条错误消息,指出“无法确定流式上传的流大小”。任何想法如何解决这个问题?

【问题讨论】:

    标签: php upload amazon-s3


    【解决方案1】:

    您对远程服务器/主机有任何控制权吗?如果是这样,您可以设置一个 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 标头。

    【讨论】:

    • 我无法控制远程服务器/主机。我已经尝试过建议的方法,但即使它只是请求标头,它也会大大减慢进程。我决定将我的服务器也移到亚马逊(与存储桶在同一个可用区),现在它已经跟上速度了。
    【解决方案2】:

    您可以像这样将文件从 url 直接上传到 Amazon S3(我的示例是关于 jpg 图片):

    1.将 url 中的内容转换为二进制

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

    2。创建一个带有 body 的 S3 对象以将二进制文件传递到

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

    仅此而已,而且速度非常快。享受吧!

    【讨论】:

    • 使用 file_get_contents 您首先将文件的内容移动到服务器,然后移动到 S3,因此不会消除额外的流量
    • 是的,你是对的。服务器在发送到 S3 之前读取数据(额外的流量和额外的时间)。我以为您在从 Url 读取数据时遇到了麻烦。您是否找到了将内容直接发送到 S3 的解决方案?谢谢
    • 这不是一个正确的解决方案,Bjorn 想将文件直接从他的远程服务器传输到 S3,投反对票。
    猜你喜欢
    • 2020-03-17
    • 2017-09-24
    • 2018-04-25
    • 1970-01-01
    • 2019-04-28
    • 2020-10-10
    • 2018-08-13
    • 2022-01-11
    • 1970-01-01
    相关资源
    最近更新 更多