2013-01-21 2 views
2

온라인 인보이스 시스템을 사용 중이며 해당 API를 통해 PDF 인보이스를 base64로 압축 된 zip 형식의 PDF 파일로 다운로드 할 수 있습니다. 이 문자열을 base64_decode()로 디코딩 한 다음 파일로 저장합니다. file_put_contents('temp/soubor.zip', $data);PHP zip 파일 추출 - 항목 크기가 잘못되었습니다.

이제이 zip 파일을 창에서 열고 싶다면 괜찮습니다. 하지만 PHP를 통해 압축을 내가 호출하는 경우 :

$zip = new ZipArchive; 
if ($zip->open('temp/soubor.zip') === TRUE) { 
    print_r($zip->statIndex(0)); 
    $zip->close(); 
} 

내가

Array ([name] => zipEntryName [index] => 0 [crc] => 1906707552 [size] => -1 [mtime] => 1358774308 [comp_size] => -1 [comp_method] => 8) 

모든 크기를 제외하고 괜찮 얻을 - -1이며, 그 큰 문제이기 때문에 그것은하지 않습니다 아무것도 추출하십시오.

지금 흥미로운 점은 : winRar에서 zip 파일을 열고, 복구 아카이브를 선택하고, 내 스크립트에서 복구 된 zip 파일을 열면 정확한 크기가 나오고 파일을 올바르게 추출 할 수 있습니다. btw 보관 파일은 260KB입니다.

+0

복구하려면 열어야합니다. 원본 보관 파일이 손상되었거나 비정상적이거나 불완전한 것으로 보이는 것 같습니다. gzip과 같은 것이 아니라 zip입니까? – datasage

+0

정말 손상되었는지 확실하지 않습니다. WinRar는 매우 견고하므로 약간 손상된 파일도 열 수 있습니다. 그것은 데이터가 괜찮아 보인다, 오직 PHP는 압축 파일의 크기를 올바르게 읽을 수 없습니다. 파일은 ZIP64 – Mroz

+0

입니다. 또한 열려있는 gzip 파일을 감지합니다. 파일의 처음 4 바이트를 읽고 게시 할 수 있습니까? 파일의 정확한 형식 (Magic bytes)을 결정하는 데 도움이 될 것입니다. – datasage

답변

0

수신 된 버퍼의 잘못된 방식으로 우편 번호를 저장하면 조작 된 데이터가 포함됩니다. (아마 알 수없는 크기의 데이터 스트림에서 '즉시'빌드는,

<?PHP 

    $handle = fopen('temp/soubor.zip', 'w'); 
    fwrite($handle, base64_decode($zipdatabase64)); 
    fclose($handle); 

?> 
1

조작 된 아카이브 같은데, 모든 우편 패킷이 제대로 출력에 기록하지 : 요) (file_put_contents를 대신하여 파일을 저장이 시도 또는 스트림이 플러시되지 않아 중앙 디렉토리가 기록되지 않음). zipinfo를 실행하여 자세한 zip 파일 정보를 확인할 수 있습니다. http://www.info-zip.org/mans/zipinfo.html

관련 문제