2009-10-03 11 views
2

내 Amazon S3 스토리지에 여러 개의 비디오 파일이 저장되어 있습니다. PHP 스크립트를 만드는 중입니다. here과 매우 유사하며 사용자가 비디오를 하드 드라이브에 다운로드 할 수 있습니다.PHP 강제로 원격 파일 다운로드

나는이 같은 것을 사용하고 싶습니다 :

<?php 
$file_name = $_GET['file']; 
$file_url = 'http://www.myamazons3.com/' . $file_name; 
header('Content-Type: application/octet-stream'); 
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"".$file_name."\""); 
readfile($file_url); 
exit; 

그러나, 나는 비디오 내 서버를 통해 올 수 있기 때문에이 대역폭을 증가 시킨다는 인상입니다.

어떻게하면 내 자신의 서버를 통해 먼저 읽지 않고이 비디오를 강제로 다운로드 할 수 있을지에 대한 아이디어가 있습니까?

감사합니다.

+0

PHP를 사용하여 (예 : 서버 측 스크립트) 서버가 파일을 중계해야합니다. 클라이언트 측 구현 (예 : 자바 스크립트)에 대한 api를 확인하십시오. – vdbuilder

답변

0
header('Location: ' . $file_url); 
+0

요청을 리디렉션하는 방법입니다. 그러나 '위치'이전에 출력 한 모든 헤더는 위치 헤더 이후에 이전 HTTP 헤더와 관계가없는 새로운 HTTP 요청이 생성되기 때문에 무의미합니다 (HTTP는 상태 비 저장 프로토콜이므로). – Marko

+0

S3에 파일을 넣을 때 content-type을 지정하면 전송 인코딩 자체가 제대로 작동하고 파일 이름이 그대로 사용되므로 제대로 작동합니다. 파일이 S3에서 공개되지 않은 경우 보안 된 시간 제한 URL (S3 문서 세부 정보 ...)을 생성 한 다음 해당 파일로 리디렉션해야합니다. – Greg

+0

그래서 현재, 내 S3에서 MP4 중 하나를 열면 (어쨌든 Firefox에서) MP4가 포함되어 재생되기 시작합니다. 어떤 내용 유형을 호출해야합니까? 어떻게 그렇게 할 수 있습니까? – Dodinas

1

당신이 언급 한 PHP 스크립트는 정상적으로 작동하지만 주된 단점은 매번 방문자가 사이트에서 파일을 요청하면 자신의 서버가 S3에서 파일을로드 한 다음 해당 데이터를 브라우저로 전달합니다. 트래픽이 적은 사이트의 경우 큰 문제는 아니지만 트래픽이 많은 사이트의 경우 자체 서버를 통해 모든 것을 실행하지 않는 것이 좋습니다.

다행히도 파일을 S3에서 다운로드하도록 설정하는 방법은 매우 간단합니다. 콘텐츠 유형 및 콘텐츠 처리를 설정하기 만하면됩니다 (일부 브라우저에서는 콘텐츠 처리가 작동하지만 모든 브라우저에서 둘 다 설정해야 함).

이 코드는 고의가 아닌에서 아마존 S3 PHP 클래스를 사용하고 있다고 가정한다 :

"응용 프로그램/octet-stream을", "내용 - 처리"=> "첨부 파일")); ?>

이제 모든 파일을 다운로드해야합니다. 변경 사항을 보려면 캐시를 지워야 할 수 있습니다. 그리고 분명히 브라우저에서 "인라인 (inline)"으로로드되기를 원하는 모든 파일에서 그렇게하지 마십시오.

이 솔루션의 좋은 점은 미디어 파일을 직접로드하는 애플리케이션 (예 : 플래시의 mp3 플레이어)이 콘텐츠 유형 또는 콘텐츠 처리에 신경 쓰지 않아도 파일을 재생할 수 있다는 것입니다. 브라우저에서 동일한 파일을 다운로드하려면 링크를 클릭하십시오. 사용자가 이미 플래시에서 파일로드를 완료했다면 캐시에 파일이 남아있을 가능성이 높습니다. 즉, 다운로드가 매우 빨라지고 S3에서 추가 대역폭 비용이 들지 않습니다.

0

나는 이것이 오래된 스레드라는 것을 알고 있지만, 지난 한 해 동안 S3 팀은 요청시 특정 HTTP 헤더를 무시할 수있는 request parameters에 대한 지원을 추가했습니다.

예를 들어 SVG 이미지를 image/svg+xml으로 업로드 할 수 있지만 다운로드 할 때 application/octet-stream으로 검색 할 때 헤더를 무시하면 다운로드가 강제됩니다.

AWS SDK for PHP을 사용하면 Aws\S3\S3Client::createPresignedUrl() 방법을 사용하여이를 수행 할 수 있습니다.