2012-05-22 24 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

リモートサーバー/ホストを制御できません。私は既に提案された方法を試しましたが、ヘッダーを要求しても、処理が大幅に遅くなりました。サーバーをAmazonに移動することを決めました(バケットと同じ可用性ゾーン内)。これで速度が向上しました。 – Bjorn

2

あなたは(私の例では、JPG画像についてです)このようにアマゾンS3への直接のURLからファイルをアップロードすることができます

1.バイナリ

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

2でURLからコンテンツを変換します。

$s3 = new AmazonS3(); 
$response = $s3->create_object($bucket, $filename, array(
    'body' => $binary, // put the binary in the body 
    'contentType' => 'image/jpeg' 
)); 
にバイナリを渡す とS3オブジェクトを作成

それはすべてですが、非常に高速です。楽しい!

+3

file_get_contentsを使用すると、まずファイルの内容をサーバーに移動してからS3に移動し、余分なトラフィックを排除しません。 – Bjorn

+1

はい、正しいです。サーバーはS3に送信する前にデータを読み取ります(余分なトラフィックと余分な時間)。私はあなたがUrlからデータを読むのに困っていると思った。 S3に直接コンテンツを送信するソリューションを見つけましたか?ありがとう –

+0

残念ながら、 – Bjorn

関連する問題