2010-07-23 9 views
2
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: private",false); 
header("Content-type: application/force-download"); 
header("Content-Disposition: attachment; filename=\"". $file ."\";"); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: ".filesize($file)); 
file_get_contents($file); 
readfile($file); 
exit(); 

내가 뭘 잘못하고 있니? 내 서버의 파일을 사용자의 하드 드라이브로 다운로드하면 안됩니까? 어떻게 든 모든 파일이 손상되었습니다! 또한 어떻게 내가 다운로드 한 파일의 파일명을 바꿀 수 있는지 궁금합니다.php : 강제로 hd로 다운로드 하시겠습니까?

$file에는 항상 내 파일의 전체 경로가 포함됩니다. 시도하면 header('Location:' . $file); 브라우저가 성공적으로 내 파일을 엽니 다. 그러나 파일이 .jpg 인 경우 브라우저는 다운로드 창을 표시하지 않습니다. 대신 브라우저 창에서 파일을 엽니 다. 모든 파일을 hd로 다운로드하고 싶습니다.

제발 도와주세요. 나는 일주일 넘게이 일을 끝내고 해결책을 찾을 수 없습니까?

+0

존재하는'파일 이름 = \ "". 파일 이름 : "basename ($ file)."\ ";"'무엇이'file_get_contents ($ file);'라인입니까? – VolkerK

답변

4

왜 대신 "강제 다운로드"또한

header("Content-type: application/octet-stream");

가 왜 file_get_contentsreadfile을하고 사용할 수 있습니까? 오직 하나만 필요합니다 - 기본적으로 파일이 두 번 포함되어 손상된 것입니다. 저는 여기에 위의 코드를 실행하게하는 방법입니다

header("Cache-Control: no-cache"); 
header("Expires: -1"); 
header("Content-Type: application/octet-stream;"); 
header("Content-Disposition: attachment; filename=\"" . basename($file) . "\";"); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: " . filesize($file)); 
echo file_get_contents($file); 

충분해야한다 - 너무 오래 $ 파일 경로를 포함뿐만 아니라 이름을 사용해야하는 경우 파일이 실제로

+2

'echo file_get_contents ($ file)'보다'readfile ($ file)'을 선호합니다. (문자열로) 전체 파일 컨텐트를 메모리로 읽어 들이고 다시 에코 할 필요가 없습니다. – VolkerK

+0

이것은 매우 사실입니다. 스크립트의 주된 문제점은 컨텐트 처리를위한 기본 이름의 부족과 두 가지 "파일 읽기 "readfile은 아마 더 적합 할 것이다 - 나는 항상'file_get_contents'를 사용했다. –

관련 문제