2014-10-03 3 views
0

확장자가없는 파일이 있지만 그 파일은 tiff라는 것을 알고 있습니다. 나는 PHP를 통해이 파일을 다운로드 할 수 있기를 원한다. PHP에서 확장명이없는 파일을 다운로드하는 방법

나는 다음과 같은 내용이 다른 PHP 페이지에 대한 링크가있는 페이지를 만들었 :
<?php 

$imgPath = 'http://server/23700-b074137f-eb5c-45d6-87c2-13c96812345b'; 
header("Content-disposition: attachment; filename=invoice.tiff"); 
header("Content-type: image/tiff"); 
readfile($imgPath); 
?> 

내가 링크를 클릭

, 나는 invoice.tiff 다운로드 프롬프트 수 있지만, 0 바이트입니다. 그러나 서버의 파일 이름을 23700-b074137f-eb5c-45d6-87c2-13c96812345b.tiff로 변경하고 ($ imgPath를 변경하면) 작동합니다.

확장명을 포함하도록 파일의 이름을 바꾸지 않고 어떻게 수행합니까?

+0

다운로드를 프록시 방식으로하는 이유가 있습니까? 이 모든 여분의 대역폭 오버 헤드를 추가하여 얻는 것은 파일의 이름을 바꾸는 것입니다. –

+0

파일이있는 서버에서 내 페이지를 호스팅 할 수 없습니다. 사용자가 파일을 다운로드하거나 볼 수 있도록 파일에 링크해야합니다. –

+0

@devlincarate 그러면 파일에 링크 만하고 서버를 통해 프록시하지 마십시오. 내가 말했듯이. 파일의 이름을 바꿀 수있는 것 외에는 아무것도 얻지 못하고 있지만 많은 대역폭을 소비하고 최종 사용자의 다운로드 속도가 느려집니다. –

답변

1

'tiff'확장명이 서버에 알려진 파일 유형으로 등록되어있을 수 있습니다. 이름을 바꾸고 요청할 때 권한을 열면 권한이 열립니다. 그러나 위의 'Mike B'에서 언급했듯이 보안 문자를 사용하지 않으면 보안 문자로 읽지 못할 수 있습니다. 이를 확인하려면 브라우저 주소 표시 줄에 파일 이름을 입력하고 'tiff'확장자가 있거나없는 경우 열리십시오. 보안 문제를 극복하기위한 해결 방법은 없으며 매우 심각한 서버 보안을 변경하지 못합니다.

+0

예,이게 전부입니다! IIS http://www.serverintellect.com/support/iis/enable-no-extensions/의 설정처럼 보입니다. –

1

URL에서 파일을 검색하므로 readfile의 'fopen wrappers'가 활성화됩니다. 일반적으로 불필요한 오버 헤드와 (이 경우) 불필요한 '마법'동작을 유발하기 때문에 로컬로 작업 할 때 특히이 작업을 수행해서는 안됩니다.

파일의 로컬 경로에 readfile을 사용하면 PHP의 기본 동작을 피하기 위해 마지막 줄 대신 die(file_get_contents($imgPath))을 사용하거나 괜찮습니다.

+0

이것을 시도 할 때 여전히 0 바이트로 다운로드 중입니까? –

+0

또한 파일이 로컬이 아니며 다른 서버에 있습니다. –

+0

@devlincarnate 당신이하고있는 일을 막을 수있는 모든 종류의 보호 계획이 있습니다 .. 요청/응답을 검사하고 누락 된 부분을 찾을 수있는 하위 수준의 클라이언트가 필요합니다. 어쩌면 그들은 사용자 에이전트를 읽거나 존재하지 않는 경우에 죽는 무언가를 가지고있을 수도 있습니다. 파일 확장자는 문제와 전혀 관련이 없습니다. 일반적인 화면 스크래핑 문제를 찾아 보면 해결책을 찾을 수 있습니다. –

0

그것은 나를 위해 작동 : '콘텐츠 - 길이 :'(

// 테스트되지 않은 코드 헤더 :

$imgPath = 'http://server/23700-b074137f-eb5c-45d6-87c2-13c96812345b'; 
$f = fopen($imgPath, "r"); 
header("Content-disposition: attachment; filename=invoice.tiff"); 
header("Content-type: image/tiff"); 
fpassthru($f); 
+0

나는 여전히 0 바이트를 얻고 있습니까? "TIFF 파일 (0 바이트)" –

+0

그것은 귀하의 서버입니까? 서버 로그에 무엇이 있습니까? 너의 어쩌면 이런 식으로 접근하지 못하게 막혔을거야. – Styx

+0

두 서버 모두 내 네트워크에 있습니다. IIS 로그를 볼 수 있습니까? 또는? –

0

당신은 또한과 같이 Content-Length 헤더를 추가해야합니다 .strlen (stream_get_contents을 ($ imgPath))));

관련 문제