2017-01-11 29 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を使ってImageをクライアントにレンダリングすると、クライアントは正しく表示されます。問題は、そのファイルストリームがS3に転送されるときです。 –

+0

@PabloAdoue ::あなたはContent-Lengthを供給しようとしましたか? –

答えて

0

イメージをS3バケットにアップロードすると、プライベートになります。直接ダウンロードすることはできません。オブジェクトをユーザーにダウンロードできるようにするには、一般的な読み取りアクセス権を与える必要があります。

+0

問題はACLではありません。 SDKはフロントエンドで(パーミッションに基づいて)署名付きリンクを生成するため、プライベートとしてS3にアップロードされます。問題は、アップロードされたファイル(S3コンソール上)がダウンロード時に空であることです。私はACLとしてpublic-readを使用するように試しましたが、結果は変わりませんでした。私が思う問題は、リモートファイルコンテンツ(file_get_content)をアップロードしようとしていることです。 –

+0

@PabloAdoueその後、S3バケットにアップロードする前に画像が表示されていることを確認してください。 –

+0

画像はアップロードする前に表示されます。 Content/typeヘッダーを "image/png"に設定してecho $ file_contentを設定して、コンテンツをクライアントにレンダリングすると、画像が適切にレンダリングされます。 S3Object Bodyに$ file_contentを置くと問題になります。 –

関連する問題