PHP에서는 내 서버에 저장하지 않고 브라우저에 S3 파일을 다운로드하고 싶습니다.

StackOverflow https://stackoverflow.com/questions/772505

문제

Amazon의 S3에 파일이 있습니다. 그들은 고유 한 ID로 명명되므로 중복이 없습니다. 공인 URL을 사용하여 액세스하고 있습니다. 브라우저로 전달할 수 있어야하지만 이름을 바꿔야합니다. 지금은 Fopen을 사용하고 있지만 파일을 브라우저에 제공하기 전에 파일을 내 서버로 다운로드하고 있습니다. 내 서버를 브라우저로 '통과'하는 방법은 어떻게해야합니까? 또는 다운로드를 어떻게 버퍼링합니까 - 내 서버에 작은 청크를 다운로드하고 다음 청크를 다운로드하는 동안 브라우저로 전달합니까?

또한 - CloudFront를 사용하고 싶지만 인증 된 URL을 제공하지 않습니다. Curl을 사용하여 요청에 대한 자격 증명을 보낼 수 있다고 생각합니다. CURL을 사용하여 이런 종류의 '통과'파일을 할 수 있습니까?

감사!

도움이 되었습니까?

해결책

S3의 작동 방식에 익숙하지 않으므로이 솔루션이 가능한지 모르겠습니다. 그러나 사용자의 브라우저를 파일로 간단히 리디렉션 할 수 없습니까? 내가 올바르게 이해하면 S3을 사용하면 버킷의 모든 파일에 대한 웹 URL을 만들 수 있습니다. 예를 들어, 이들이 급여 다운로드라면 S3가 해당 다운로드에 대한 임시 URL을 생성하도록하십시오 그런 다음 사용자가 다운로드 한 후에는 제거하십시오.

옵션이 아닌 경우 이러한 PHP 클래스를 시도 할 수 있습니다.

  • HTTP 프로토콜 클라이언트 - HTTP 리소스 (아래 스트림 래퍼에서 사용)를 구현하는 클래스. 요청을 스트리밍 할 수 있습니다.
  • GHTTP - 원격 HTTP 리소스를 파일로 처리 할 수있는 HTTP 스트림 래퍼. fopen(), fread(), 등.
  • 아마존 S3 스트림 래퍼 -GHTTP와 동일한 개발자의 Amazon S3 스트림 래퍼. 또한 일반 파일과 같이 원격 자원에 액세스 할 수 있습니다. fopen('s3://...').

편집하다:

이 페이지 URL에서 인증 키를 인코딩하여 요청을 "사전 평가"하는 방법에 대한 정보가 있습니다. 제목의 섹션 아래에 있습니다. 쿼리 문자열 요청 인증 대안.

// I'm only implementing the parts required for GET requests.
// POST uploads will require additional components.
function getStringToSign($req, $expires, $uri) {
   return "$req\n\n\n$expires\n$uri";
}

function encodeSignature($sig, $key) {
    $sig = utf8_encode($sig);
    $sig = hash_hmac('sha1', $sig, $key);
    $sig = base64_encode($sig);
    return urlencode($sig);
}

$expires = strtotime('+1 hour');
$stringToSign = getStringToSign('GET', $expires, $uri);
$signature = encodeSignature($stringToSign, $awsKey);

$url .= '?AWSAccessKeyId='.$awsKeyId
       .'&Expires='.$expires
       .'&Signature='.$signature;

그런 다음 사용자를로 리디렉션하십시오 $url, 그리고 파일을 다운로드 할 수 있어야합니다. 서명은 일원 암호화 체계 (SHA1)로 인코딩되므로 AWS Secret Access Key가 발견 될 위험이 없습니다.

다른 팁

httpauth 및 httpauthtype를 지정하기 위해 request_options와 함께 http_get을 사용해 보셨습니까? 이 메소드가 문자열 유효한 유형을 가정하는지 여부는 기억하지 못합니다.

그것이 성공하면 올바른 Mime 유형을 제공하고 브라우저에 쓸 수 있어야합니다.

readfile을 사용하여 BU를 사용해 보셨습니까?http : // username : password@host/filename.ext") ?

그것은 단지 출력 버퍼에 직접 우회하고 쓸 것이지만, 콘텐츠 유형이 우려되는 경우 먼저 확인해야합니다.

EN URL을 readfile로 인수로 사용하려면 PHP가 URLWrapper-Support로 컴파일해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top