2017-01-11 284 views
0

我试图使用PHP获取远程文件(图像),然后将该图像放到S3存储桶中。将PHP file_get_contents流保存到AWS S3

它主要工作,除了上传到S3的文件再次下载时为空。

这里是我到目前为止的代码:

$src = "http://images.neventum.com/2016/83/thumb100x100/56f3fb1b9dbd6-acluvaq_63324840.png"; 
$name = md5(uniqid()); 
$ext = pathinfo($src, PATHINFO_EXTENSION); 

$file_content = file_get_contents($src); 
$filename = "{$name}.{$ext}"; 
    try { 
    $file = $this->s3->putObject([ 
     'Bucket' => getEnv('s3bucket'), 
     'Key' => $filename, 
     'Body' => $file_content, 
     'ACL' => 'private' 
    ]); 
    } catch (S3Exception $e) { 
    //Catch 
    } 

希望能对你有所帮助。提前谢谢你。

更新1:

的问题是不是与ACL(我一直在使用“公共”测试),是S3的存储对象不正确uploded(我认为是值得做的编码,但一直没能弄清楚)

+0

你检查了$ file_content不是NULL或FALSE吗?对于file_get_contents()来处理http://你需要在php ini中设置:http://www.php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen – at0mzk

+0

是的,我有。事实上,当我使用$ content_type将图像渲染到客户端时,它会正确显示。问题在于文件流何时转移到S3。 –

+0

@PabloAdoue ::你有没有试过提供Content-Length? –

回答

0

一旦你上传图片到S3存储桶,它将是私人的,你不能直接下载。您需要提供公共读取权限才能将对象提供给用户下载。

+0

问题不在于ACL。它以私有方式上传到S3,因为在前端SDK会生成一个签名链接(基于权限)。问题是上载的文件(在S3控制台上)在下载时为空。我曾尝试使用public-read作为ACL,但并未改变结果。我想这个问题是我试图上传远程文件内容的方式(file_get_content) –

+0

@PabloAdoue然后必须确保图像在上传到S3存储区之前可见。 –

+0

图像在上传前可见。如果我通过将内容/类型标头设置为“image/png”并回显$ file_content将内容呈现给客户端,则图像正确呈现。一旦我把$ file_content放在S3Object Body上就是问题所在。 –