2013-02-21 2 views
2

현재 Amazon S3 계정에서 파일을 다운로드하는 데 다음 코드를 사용하고 있습니다.readfile()의 대안

if(isset($_POST['file_name'])) { 
$bucket = $_POST['bucket']; 
$fname = $_POST['file_name']; 
$accessKey = 'AKIAIEHFBME6F5Q62FTQ'; 
$secretKey = '<REMOVED>'; 
$file_type = pathinfo($fname, PATHINFO_EXTENSION); 

$mp3_url = el_s3_getTemporaryMP3Link($accessKey, $secretKey, $bucket, $fname);  
$zip_url = el_s3_getTemporaryZipLink($accessKey, $secretKey, $bucket, $fname); 


if ($file_type === "mp3") { 
    header('Content-type: audio/mpeg3'); 
    header('Content-Disposition: attachment; filename="themixtapesite_'.$fname.'"'); 
    readfile($mp3_url); 
    exit(); 
} else if ($file_type === "zip") { 
    header('Content-type: application/zip'); 
    header('Content-Disposition: attachment; filename="themixtapesite_'.$fname.'"'); 
    readfile($zip_url); 
    exit(); 
} else { 
    echo "Sorry, File does not exist"; 
} 

}

당신이 파일 확장자는 다음 날 S3를 사용하는 요점 내 EC2 서버 부하를 밝게하는 것입니다 read file()

에의 관련 URL을 전달 무엇 확인 볼 수 있듯이. 그러나이 방법을 사용하면 S3에서 EC2 서버를 통해 파일을 가져 오는 파일을 다운로드하는 것처럼 보입니다 (iStat을 통해 서버로드를 모니터링하면 파일을 다운로드 할 때 작업량이 늘어남을 알 수 있음).

파일을 EC2 서버가 아닌 S3에서 직접 다운로드 할 수있는 다른 방법이 있습니까 ??

업데이트 : 그냥 빠른 업데이트 - 나는 아파치보다는 Nginx를 사용하고 있으므로 .htaccess는 아무도 제안 할 생각이 없다면.

답변

1

공개적으로 액세스 할 수있는 URL 또는 서명 된 URL이있는 경우. 위치 리디렉션을 사용하여 클라이언트에 직접 전달할 수 있습니다. 파일이 그냥 브라우저에서 재생은 MP3의 경우

header('Location: ' . $myUrl);

+0

덕분에,하지만 내 문제입니다. 그 파일을 강제로 다운로드하려고합니다. 나는'Content-Disposition : attachment;가 파일을 재생하는 대신 브라우저에 다운로드하도록 지시했다고 생각했지만'readfile()'을'header ('위치)로 변경하면 아무 것도하지 않는 것처럼 보입니다. ..)' –

+0

s3의 파일로 헤더를 설정할 수 있어야합니다. 나는 이런 식으로 내용 처리 헤더를 설정하려고 시도한 적이 없지만 작동 할 수도 있습니다. – datasage

+0

죄송합니다, 저를 잃어 버렸습니까? –