2009-08-26 22 views
2

나는 다음과 같은 방법으로 헤더를 설정합니다. 프로덕션 서버, Apache와 Solaris 및 컴파일 된 PHP에서 파일 크기가 0 인 파일을 얻습니다. 따라서 빈 파일이 생성됩니다.콘텐츠 길이 헤더는 항상 0

구성 매개 변수가 있습니까? 'Content-Length : 1222'를 설정하는 것을 막을 수있는 것이 있습니까?

감사합니다.

코드 :

<?php 

는 error_reporting (E_ALL); ini_set ('display_errors', '1');

require 'includes/prepend.inc.php'; 
require __ADMIN_DIR__.'/AdminInfo.php'; 
$intFile = QApplication::QueryString('fileID'); 
if($intFile == '') die('Error: missing ID'); 
$objFile = File::Load($intFile); 
$blnRight = false; 
$objAdminInfo = new AdminInfo(); 
if($objAdminInfo->isAdmin()) { 
    $blnRight = true; 
} 
else { 
    $objSecMan = new SecurityManager(
     'file:'.$objFile->FileID, 
     $objAdminInfo->getUserID() 
    ); 
    $blnRight = $objSecMan->processResource('view'); 
} 

// if the user can modify and or publish, can even view the file 
if(!$blnRight) { 
    $blnRight = $objSecMan->processResource('modify'); 

    if(!$blnRight) { 
     $blnRight = $objSecMan->processResource('publish'); 
    }  
} 

//$strPath = __UPLOADS__.DIRECTORY_SEPARATOR.$objFile->FileID; 
$strPath = 'subdept.csv'; 

if (file_exists($strPath) && $blnRight) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.$strPath);//$objFile->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($strPath)); 
    ob_clean(); 
    flush(); 
    readfile($strPath); 
    exit; 
} 
else { 
    die('Restricted access'); 
} 

?>

나는 그것이 작동 $ strPath하기 전에 코드를 언급, 그래서 피 묻은 프레임 워크에 뭔가해야

. 전체 CMS를 버리고 싶습니다.

답변

4

전송 인코딩 헤더를 확인하십시오.전송 인코딩을 청크 경우, 콘텐츠 길이 필드는

가능한 원인 설정되지 않습니다, 아파치 자세한 내용은 다음 링크를 참조하십시오

않는 반면 ZendServer는 청크 분할 인코딩을하지 않는다는 것입니다

http://en.wikipedia.org/wiki/Chunked_transfer_encoding

http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html

+0

감사! 수신 : 전송 인코딩 : 청크 아니요 'Content-Length' 서버를 중지하는 방법을 찾아야합니다. – rtacconi

+0

잘 모르겠지만 젠드 프레임 워크는 청크 인코딩을 사용할지 여부를 결정합니다. 설명서를 확인해야합니다. – Ram

+0

확인해 주셔서 감사합니다. – rtacconi

0

파일이 프로덕션 서버에 있는지 확인하십시오? 대소 문자가 구분 될 수 있습니다 (예 : '파일'과 '파일'은 Windows에서는 동일하지만 UNIX에서는 다를 수 있음)? Apache/PHP를 실행하는 사용자에게 읽기 권한이 있습니까?

2

파일이 실제로 지정된 경로 (is_file은 존재 여부와 파일이 일반 파일인지 검사합니다)에 있는지 확인하고 클라이언트에 보내기 전에 읽을 수 있습니다 (is_readable). filesize 오류가 발생하면 거짓을 반환합니다. 따라서 이것이 0 값의 원인이거나 의 콘텐츠 - 길이에 대한 빈 값일 수 있습니다.

그리고 Ferdinand Beyer already mentioned으로 스크립트가 이식 가능하고 다른 환경을 처리 할 수 ​​있는지 확인하십시오.

+0

, 내가 777에 파일을 테스트입니다 : .htaccess한다 RewriteRule은 GZIP을 비활성화합니다. 파일이 존재하지만 파일 크기가 0입니다. 브라우저에 URI를 넣어서 다운로드 할 수 있지만 스크립트는 항상 0으로 렌더링됩니다. – rtacconi

+0

@rtacconi : 응답의 실제 원시 HTTP 헤더를 확인 했습니까? – Gumbo

+0

아니요, 확인해 보았습니다.하지만 텔넷에서 사용할 주석에 대한 HTTP 튜토리얼을 찾아야합니다. – rtacconi

0

오류를 사용하면 오류가 발생합니까?

error_reporting(E_ALL); 
ini_set('display_errors', '1'); 
+0

아니요, 오류가 없습니다. – rtacconi

0

에 p roblem 아파치, 다운로드를 Gzip으로 압축 컨텐츠 길이를 수정 돌보는 또는 귀하의 경우, 해당 헤더를 제거하고

콘텐츠 인코딩을 추가하는 것이 될 수있다 :

당신은 추가 할 수 있습니다 청크 그것은 파일 이름의 문제가되지 않습니다

그것은 권한 문제가되지 않습니다
RewriteRule . - [E=no-gzip:1]