2011-08-04 6 views
1

symfony에서 모든 유형의 파일을 포함하는 zip 아카이브를 보낼 때 이상한 동작이 발생합니다. 문제는 브라우저에서 다운로드 한 zip 파일에 파일의 시작 부분에 '비트'가 추가로 포함되어 있다는 것입니다. 이제 여기에 이상한 무엇php symfony의 setContent() 이후에 손상된 ZipArchive

$tmpFileName = tempnam("/tmp", "xb_"); 
$zip = new ZipArchive(); 
$zip->open($tmpFileName, ZipArchive::CREATE); 
$zip->addFile('[directory_inside_webspace]/test.pdf', 'myTest.pdf'); 
$zip->close(); 
$this->getResponse()->clearHttpHeaders(); 
$this->getResponse()->setContent(file_get_contents($tmpFileName)); 
$this->getResponse()->setHttpHeader('Content-Type', 'application/zip'); 
$this->getResponse()->setHttpHeader('Content-Disposition', 'attachment; filename=archive.zip'); 
return sfView::NONE; 

:

여기 내 코드입니다./tmp 아래의 임시 zip 파일은 정상입니다. 아무 문제없이 추출 할 수 있습니다. 그러나 브라우저가 전송 한 파일이 손상되었습니다. 내가 문제없이 열 수 있습니다 손상된 파일 추가 '0A'를 제거하면

working file:  50 4B 03 04 14 00 00 
corrupt file: 0A 50 4B 03 04 14 00 00 

: 나는 헥스 편집기에서 모두 열 때, 처음 몇 바이트는 다음과 같다. 이제는/tmp에 작성된 tmp 파일과 정확히 동일한 파일입니다.

누구나 전에 이런 행동이 있었습니까 ?? 4 일 넘게이 문제에 갇혀 있고 오류를 찾을 수 없습니다. 다른 심포니 모듈에서 똑같은 코드를 사용하고 있습니다. 어떤 아이디어?

----- 업데이트는 ------

문제는 zipArchive 또는의 setContent 관련되지 않았습니다. 함수의 시작 부분에 쿼리가있었습니다. 내 교리 모델의 클래스 'Bill.class.php'에서

$bill = Doctrine::getTable('Bill')->find($request->getParameter('id')); 

나는 클래스 빌은 새로운 라인이 화면하기 인쇄했다 인스턴스화 그래서 때
<?php 

전에 빈 줄을했다.

필자는 zip 보관소를 브라우저에 보낼 때 '헤더가 이미 전송 됨'과 같은 오류 메시지를 표시하지 않는 이유가 궁금합니다.

답변

2

0A은 개행 문자입니다. 관련된 모든 파일의 <?php 태그 앞에 개행 문자가없고, 닫는 태그를 생략하지 않는 한 ?> 태그 다음에 개행 문자가 없어야합니다 (권장 됨).
가장 많이 발생하는 원인은 다운로드 작업의 actions.class.php입니다.

+0

고마워요, 제 문제였습니다! – cb0

1

며칠 전 심포니에서 똑같은 문제가 발생했습니다. 문제는 내 대답에 몰래 들어가는 여분의 캐릭터 (예 : 스페이스)입니다. 대신에 sfView :: NONE; 마지막에 주사위를 넣으면 무슨 소린가? 이 시도 :

여기
//make sure toolbar is disabled just to be extra safe 
sfConfig::set('sf_web_debug', false); 

$tmpFileName = tempnam("/tmp", "xb_"); 
$zip = new ZipArchive(); 
$zip->open($tmpFileName, ZipArchive::CREATE); 
$zip->addFile('[directory_inside_webspace]/test.pdf', 'myTest.pdf'); 
$zip->close(); 

$this->getResponse()->clearHttpHeaders(); 
$this->getResponse()->setHttpHeader('Content-Type', 'application/zip'); 
$this->getResponse()->setHttpHeader('Content-Disposition', 'attachment; filename=archive.zip'); 

// Unlock session in order to prevent php session warnings 
$this->getUser()->shutdown(); 

// Send http headers to user client 
$this->getResponse()->sendHttpHeaders(); 

echo file_get_contents($tmpFileName); 

die; 
+1

에코 대신 readfile(); sfView :: HEADER_ONLY;를 반환합니다. 그리고 session_write_close()를 넣는 것을 잊지 마십시오; 해당 다운로드 작업에서 사용자를 차단하고 싶지 않으면 (PHP는 사용자 세션을 잠급니다). – Damien

+0

답변을 주셔서 감사합니다. 아쉽게도 생성 된 zip 아카이브는 여전히 손상되었습니다. 처음에는 동일한 추가 비트가 있습니다. : – cb0

+0

파일 내용 출력 이외의 모든 작업을 수행하면 출력은 어떻게됩니까?응답에 몰래 들어가는 바이트가 있습니까? 또한 zip의 좋은 버전과 생성 된 아카이브의 md5_file을 비교하면 어떻게 될까요? – Dan

0

내가 그것을 할 방법은 다음과 같습니다

// Unlock php session 
$this->getUser()->shutdown(); 

// Send the response 
$response->sendHttpHeaders(); 
$response->setContent(readfile(utf8_decode($tmpFileName))); 
$response->sendContent(); 

return sfView::NONE; 

그것은 아마 BOM error입니다.

+0

고마워요. 그러나 이것은 정확하게 똑같은 오류를줍니다. 나는 혼란에 빠지다. – cb0