2012-03-29 4 views
0

바이너리 파일을 base64로 인코딩하여 PHP 페이지 (인라인 코드)에 넣으려고합니다. 요청 페이지에서 브라우저로 파일을 스트리밍하면 다운로드 대화 상자가 나타납니다.
어떤 아이디어바이너리 파일을 PHP 페이지로 인코딩

+0

난 그냥 아이디어를 원하는 – MrBassam

+2

글쎄 그것은 인쇄 base64_decode ('02FAF ....')은'이다, '그 파일이 PHP 인터프리터에 사용할 수있는 메모리보다 큰 경우 실행할 수 없습니다. – mario

+0

마리오,이 usegul 답변을 코멘트로하지만 답변 자체를 게시하지 않습니다 :) – Gian

답변

1

매우 직설적입니다. readfile과 마찬가지로 http 헤더를 사용하여 강제로 다운로드 한 다음 인코딩 된 문자열을 에코합니다.

$decoded_data = base64_decode($encoded_data); 

header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename='.basename($file)); 
header('Content-Transfer-Encoding: binary'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate'); 
header('Pragma: public'); 
header('Content-Length: ' . strlen($decoded_data); 
ob_clean(); 
flush(); 
echo $decoded_data; 
exit; 
+1

나는 이것을 바로 downvote하지 않겠지 만, 만약 당신이 그것을 고치지 않는다면 ... 당신은 문자열을 두 번 해독했습니다. 한번은 데이터의 길이를 얻습니다. 한 번 출력 할 수 있습니다. 변수에'base64_decode()'의 결과를 저장하고 그 변수를'strlen()'과'echo'에 넘겨야합니다 - 만약 데이터가 100MB라면? – DaveRandom

+0

좋은 지적. 전체 파일이 메모리에로드되기 때문에 여전히 큰 파일에는 권장하지 않지만 최소한이 방법은 한 번만 디코딩됩니다. – Juhani

+0

개인적으로 * 권장하지는 않을 것입니다. 이럴 이유가 거의 없습니다. 나는 전체 응용 프로그램을 하나의 파일에 포함시키는 것이 좋다고 인정한다. (이 작업은 내가 생각할 수있는 유일한 합법적 인 이유이다.) 작은 미적인 이득과 큰 성능 비용으로 인해 실제로 실행 가능하지는 않다. 하지만 약간 답글을 쓰면 대답은 좋다 - 문자열이 스크립트에서 정적이고 파일 처리에 큰 오버 헤드가 있기 때문에 캐싱 헤더가 클라이언트 캐싱을 위해 더 잘 설정 될 것이며, 참고로 HTTP 헤더가 없다 'Content-Transfer-Encoding'으로 – DaveRandom