2012-05-22 3 views
6

PHP SDK를 사용하여 외부 URL의 파일을 Amazon S3 버킷에 직접 업로드하려고합니다. 함수 remote_filesize가 다음 인 경우PHP SDK를 사용하여 외부 파일을 AWS S3 버킷에 업로드

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

: 그러나

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 요청을 사용하고, 그리고 전체 파일을 다운로드 - 여전히, 당신은 원격 서버에 따라 올바른 콘텐츠 길이 헤더를 보냅니다.

+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

관련 문제