2011-02-01 5 views
3

PHP를 통해 파일을 업로드하는 프로세스가 있지만 결과 파일의 크기가 소스 파일보다 2 바이트 크게됩니다. 이 2 바이트가 어디서 오는지는 잘 모르겠습니다. (실제 프로세스는 파일을 슬라이스하고 슬라이스를 업로드하는 청크 업로드입니다. 각 슬라이스는 시작된 것보다 2 바이트 길어 지지만, 하나의 작은 파일로 테스트 한 결과 2 바이트가 더 커졌습니다. 출처).업로드 된 파일에 2 바이트를 추가하는 PHP

내 PHP를 첨부하고 있습니다 ... 이것은 PHP의 일반적인 기능입니까? 나는 어떤 종류의 널 터미네이터 (terminator) 또는 뭔가를 상상하고있다. (처음에는 거기에 없었던 각 파일의 끝에 \ n이있는 것처럼 보인다.) 원래 파일을 다시 어셈블하기 전에 파일을 버퍼로 읽고 마지막 두 바이트를 제거해야합니까? 나는 내가 뭔가 잘못하고 있다고 상상해야하지만, 나는 그것이 무엇이 될 것인지 혼란 스럽다.

마지막 두 바이트를 수동으로 제거해야하는 이유는 무엇이 올바른지 (바이너리 파일인지) 나머지를 내가 다시 작성하는 전체 파일에 추가하는 것입니까?


편집


PHP가 서버에 저장 각 업로드 된 파일이 마지막에 추가 0D0A 단어를 얻고있다. 그래서 ... 나는 이것이 일어나는 것을 방지하는 방법이 문제라고 생각합니다.

<?PHP 
$target_path = $_REQUEST[ 'path' ]; 
$originalFileName = $_REQUEST['original_file_name']; 
$target_path = $target_path . basename($_FILES[ 'Filedata' ][ 'name' ]); 

if (move_uploaded_file($_FILES[ 'Filedata' ][ 'tmp_name' ], $target_path)) 
{ 

     $newFilePath = $originalFileName; //this is the overall file being re-assembled 
     $fh = fopen($newFilePath, 'ab') or die("can't open file"); 

     $nextSlice = file_get_contents($target_path); //this is the slice that's 2 bytes too big each time 

     fputs($fh, $nextSlice); 
     fclose($fh); 

//  unlink($target_path); //normally I'd delete the slice at this point, but I'm hanging on to it while I figure out where the heck the 2 extra bytes are coming from. 

     fclose($fh); 

     echo "SUCCESS"; 

} 
else 
{ 
    echo "FAIL:There was an error uploading the file, please try again!"; 
} 
?> 
+0

소리가 BOM (Byte Order Mark)과 비슷합니다. 파일의 인코딩은 무엇입니까? – profitphp

+0

'fputs'를'fwrite'로 바꾸면 문제가 사라 집니까? (나는 그것들이 동의어가 될 것이라고 생각하지만 적어도'fputs'에서는 출력에 개행을 추가하므로 PHP 함수에 개행을 추가하는 버그가있을 수 있습니다 ...) –

+1

'fputs ($ fh, $ nextSlice, count ($ nextSlice) - 2)'? –

답변

0

용액이 밝혀 ($ FH, $ GLOBALS [ "HTTP_RAW_POST_DATA"])

에 fwrite 단계;

질문에 설명 된 방법을 사용할 때 마지막에 여분의 0D0A로 파일이 작성되지만 데이터를 추출하는 위의 방법은 그대로 도착합니다. 정확히 올바른 길이.

1

파일이 바이너리입니까? 나는 문자열처럼 취급하기 때문에 file_get_contents이 문제의 원인이라고 생각하고 있습니다. 어쩌면 fread을 대신 사용해보아야할까요?

+0

그것은 유망한 것으로 들리지만 주사위는 ... 같은 결과입니다. 나는 16 진수 편집을 보면서, 원래 파일의 마지막 단어는 0D0A이고 나는 마지막 두 단어 (하나의 여분의 단어 포함)가 그것 (0D0A 0D0A)의 반복임을 알 것이다. 나는 그것이 우연 일 수 있는지 (매우있을 법하지 않음)보기 위해 지금 시험 할 것이다. –

+0

@Dr Dredel 0D0A는 CrLF입니다. – profitphp

+0

CrLF ... 그게 무슨 뜻입니까? 나는 그것에 대해 무엇을해야할지 모르겠다 ... 나는 거기에 그것을 원하지 않는다 ... 내가 보내고있는 것의 일부가 아니다. :) –

관련 문제