2010-03-16 4 views
7

첫째로 : 저는 충분히 위험한 PHP를 알고 있고, 서버 관리에 대해 충분히 잘 알고있는 저급 웹 디자이너입니다. 네가 아주 분명하지 않으면 너를 이해하지 못할거야!.exe 파일이 서버에서 다운로드 될 때 손상됩니다.

설정 : 클라이언트가 특정 디렉토리에 파일을 업로드하는 웹 사이트를 설정했으며,이 파일은 사용자가 다운로드 할 수 있도록 PHP를 통해 제공됩니다. 파일은 일반적으로 50MB 이상의 실행 파일입니다. 클라이언트는 사용자가 압축을 풀 수있을만큼 정통하지 않다고 느끼기 때문에 압축하지 않으려 고합니다. 아래의 php를 사용하여 다운로드 대화 상자를 강제하고 파일이있는 디렉토리를 숨 깁니다.

차이가 있다면 Linux 서버입니다.

문제 : 사용자가 파일을 다운로드하려고하면 특정 파일이 손상됩니다. 실행 파일이지만 클릭하면 빈 DOS 창이 열립니다. 원본 파일은 다운로드하기 전에 완벽하게 열립니다. 똑같은 다운로드 절차를 거친 유사한 파일이 몇 가지 있으며 그 중 일부는 정상적으로 작동합니다.

내가 시도한 것들 : 압축 파일을 업로드 한 다음 서버에서 압축을 풀어 업로드 중에 손상되지 않았는지 확인하고 운이 없었는지 확인했습니다.
원본 파일의 바이너리 코드를 다운로드 한 파일과 비교해도 동일합니다. 따라서 파일이 실수로 파일에 아무 것도 삽입하지 않습니다.

내 downloadFile 함수의 헤더에 문제가있을 수 있습니까? 작업을위한 테스트 - :

downloadFile("../DIRECTORY/files/$filenamereplace","$filenamereplace"); 

function downloadFile($file,$filename){  
    if(file_exists($file)) { 
     header('Content-Description: File Transfer'); 
     header('Content-Type: application/octet-stream'); 
     header('Content-Disposition: attachment; filename="'.$filename.'"'); 
     header('Content-Transfer-Encoding: binary'); 
     header('Expires: 0'); 
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
     header('Pragma: public'); 
     header('Content-Length: ' . filesize($file)); 
     @ flush(); 
     readfile($file); 
     exit; 
    } 
} 

ETA위한 추가적인 정보 : 나는 정말 ($의 filenamereplace 다른 곳에서 정의) 관련이있는 경우

는, 다운로드의 PHP입니다 ...이 하나의 문제를 해결하는 방법을 잘 모르겠습니다/작동하지 않는 파일이 동일한 컴퓨터에서 수행되었습니다. - 차이가 나는 경우 원본 파일에 사용자 지정 아이콘이 있습니다. 다운로드 후에는 파일에 일반 빈 문서 아이콘이 있습니다.

추가 정보 :이 정보가 중요하다고 생각합니다. 방금 ​​파일을 직접 다운로드하려고 시도했습니다 (위의 다운로드 기능을 트리거하는 다운로드 링크를 우회하기 위해). URL로 가서 다운로드하는 방식으로 파일을 다운로드하면 다운로드 한 파일이 작동합니다. 그래서 다운로드 기능과 관련이 있다고 생각합니다. 근데 뭐??

3/17 주요 교정 - 그리고 RESOLVED- 그래서 오늘 아침에 일어 났는데 그것은 어쩌면 내가 잘못 파일을 비교하는 것을 떠올랐다. (나는 그들을 다시 바이너리 텍스트로 저장했다. 그리고 그 다음에를 비교했다. 나는 비교 프로그램이 실제 exe 파일을 가져 와서 비교할 것을 몰랐다.) 오늘 아침에 실제 exe 파일을 비교해 보았습니다. 의 차이점이 있습니다. 파일의 첫 번째 줄에 삽입 된 PHP 코드 한 줄이있었습니다. 나는 PHP를 조정하고 문제가 해결되었습니다. (필자가 인용 한 코드에서 teh $ filenamereplace 변수를 정의한 if/else 문에서 온 것입니다.) 모든 도움을 주신 것에 대해 다시 한 번 감사 드리며, 파일의 내용이 동일하다고 주장하면서 오해하실 수 있습니다.

+0

헤더를 플러시하지 않아도된다고 생각합니다. 일부 16 진수 편집기는 파일을 비교할 수 있습니다 –

+0

"@ flush(); 그럼, 라인? 헤더를 비우는 것이 문제의 원인이 될 수 있습니까, 아니면 그냥 필요하지 않다고 말하는 것입니까? (솔직히 실제로 무엇을하는지 모르겠다 ...) – Kerri

+0

설명의 한 부분 - 다운로드 한 버전이 실패한 동일한 컴퓨터에서 원본 파일 (사전 업로드)을 열 수 있습니까? 특정 기계 관련 문제를 제거하기 위해? 비트가 동일하고 다른 exes가 잘 다운로드되면 환경 적 (예 : 컴퓨터) 구성 문제를 조사해야 할 필요가있는 것 같습니다. – Eric

답변

3

"원본 파일의 바이너리 코드를 다운로드 한 파일과 비교 한 결과, 정확하게 동일합니다 (따라서 PHP가 실수로 파일에 아무 것도 삽입하지 않음)."

정말 사실이라면 문제는 다운로드 한 후에 exe가 시작되는 방법에 있어야합니다. 확실히 PHP 코드에 문제가 있어서는 안됩니다.

+0

"다운로드 한 후에 exe가 시작되는 방법"에 대해 자세히 알려주실 수 있습니까? 웹 사이트에서이를 제어 할 수 있습니까? 감사! – Kerri

+0

exe를 다운로드 한 후에 시작해야합니다. "어떻게"나는 브라우저가 시작하는지, 사용자가 탐색기에서 그것을 클릭하는지 등을 제어한다는 의미입니다. 그래도 문제가있는 이상한 곳 이니, 10000 %의 파일이 바이너리 파일인지 확실합니까? –

+0

파일은 사용자가 파일을 두 번 클릭하여 시작합니다. 설치 파일이며 클릭하면 설치 프로세스가 시작됩니다. 대신 빈 DOS 창이 나옵니다. – Kerri

3

아마도 업로드시 손상되었을 수 있습니다. BINARY가 아닌 ASCII 모드로 FTP를 통해 전송할 경우 이러한 상황이 발생할 수 있습니다.

+0

+1 나는이 자신을 더럽 혔습니다. – Xetius

+0

"내가 시도한 것들 : 압축 된 파일을 업로드하려고 시도했지만 업로드 중에 손상되지 않도록 서버에서 압축을 풀었습니다. – plod

+0

그건 내 첫 번째 생각 이었어. 그래서 압축 된 파일로 서버에 업로드를 시도한 다음 업로드 된 파일을 압축 해제하려고했습니다. 업로드시 실제 exe 파일에 대한 손상 문제를 피할 수 없었습니까? (할아버지는 저를 때렸습니다) – Kerri

관련 문제