2012-12-04 3 views
1

간단한 양식으로 게시 할 때 다운로드를 시작하는 함수를 호출합니다. 경로와 파일 이름을 데이터베이스에서 가져온 다음 머리글을 사용하여 다운로드를 시작합니다. 다운로드에 대한 내 코드는 다음과 같습니다 위의 예에서PHP 다운로드가 DB에서 오는 경로와 함께 작동하지 않습니다.

//START DOWNLOAD 
header('Content-type: "application/octet-stream"'); 
header('Content-Disposition: attachment; filename="'.$FILE_PATH.$FILE_NAME.'"'); 
header("Content-Transfer-Encoding: binary"); 
header("Connection: close") 

는 $의 FILE_PATH 변수는/다운로드/소프트웨어 /와 $ FILE_NAME 변수는 클라이언트 Installer.exe를합니다. 따라서 클라이언트에 다운로드 할 client-installer.exe (약 70MB)라는 파일이 있습니다. 대신 _downloads_software_client-installer.exe라는 파일과 약 10KB의 파일이 있습니다.

파일 경로/이름을 urlencode 할 필요가 있다고 생각했지만 해결되지 않았습니다. 그래서 나는 머리카락에 문제가 있다고 생각하지만 아마도 그것을 찾을 수 없을 것입니다.

감사합니다.

+0

Content-Transfer-Encoding을 제거하십시오. HTTP에는 존재하지 않습니다. –

답변

1

파일 이름 헤더는 파일을 호출해야하는 것을 나타냅니다. 경로가 아닌 파일 이름 만 포함해야합니다. 서버의 하드 디스크에있는 내부 경로는 관련이 없으며 클라이언트에게는 중요하지 않습니다. 서버는 응답에서 실제 파일 데이터를 출력해야하며, 클라이언트는 경로가 지정된 서버에서 가져올 수 없습니다. 을 참조하십시오

+0

@deceze 빠른 응답 주셔서 감사합니다. 이 코드를 구현하면 의미가 있습니다 :'\t \t $ file = $ FILE_PATH. $ FILE_NAME; \t \t header ('내용 - 설명 : 파일 전송'); \t \t header ('Content-Type : application/octet-stream'); \t \t header ('Content-Disposition : attachment; filename ='. basename ($ file)); \t \t header ('Content-Transfer-Encoding : binary'); \t \t header ('Expires : 0'); \t \t 헤더 ('Cache-Control : must-revalidate'); \t \t header ('Pragma : public'); \t \t header ('Content-Length :'. filesize ($ file)); \t \t ob_clean(); \t \t flush(); \t \t readfile ($ file);'올바른 파일 이름이 클라이언트에 나타나지만 여전히 10KB입니다. – Jason

+0

텍스트 편집기에서 파일을 열어 보았습니까? 아마도 유용한 오류 메시지가 포함되어 있을까요? – deceze

+0

나는 바보입니다. 파일 경로에서 하위 디렉토리를 잊어 버렸습니다. 위의 내 의견에 코드가 추가되었습니다. 고맙습니다! – Jason

관련 문제