2012-09-18 3 views
1

램프 환경에서 Drupal에서 실행되는 응용 프로그램이 있습니다. 그것은 데이터베이스에서 이미지를 전달합니다. 개인용 컴퓨터 (OS X Lion)에서 올바르게 작동합니다. dev에 서버 (아마존 EC2)에서 동일한 코드가 작동하지 않습니다. 두 서버 모두 PHP 5.3을 실행합니다. echo $fileData 사이의 데이터가 손상되어 브라우저에서이를 수신하고 있음을 확인했습니다. 또한 base64로 인코딩 된 데이터가 손상되지 않았 음을 확인했습니다 (스크립트를 사용하여 데이터를 요청하고 디코딩 한 후 파일에 저장했습니다).브라우저로가는 도중 이미지 데이터가 손상됩니다.

Drupal 측에서 코드는 메뉴 콜백을 생성하는 모듈에 있습니다. 콜백 함수는 전체 이미지를 메모리에 저장하는 것을 피하기 위해 직접 파일 데이터를 에코합니다 (PDO :: FETCH_BOUND를 사용하여 PDO :: PARAM_LOB을 사용하여 스트림을 만들었지 만 문제를 찾으려고 할 때 문자열로 바로 이동합니다). 그것은 그렇지 않았습니다). 메뉴 항목에는 기본적으로 아무 작업도 수행하지 않는 사용자 지정 배달 콜백이 있습니다. 드루팔 (Drupal이 유니 코드 지원이나 뭔가를 위해 너무 열심히 노력하고 있을지도 모르는 아이디어에 버퍼링을 시도했지만 어느 쪽도 도움이되지 못했습니다.)

누군가 내 문제를 일으킬 수있는 아이디어가 있기를 바랍니다. 내가 충분히 명확하지 않은 경우 몇 가지 코드를 게시 할 것입니다. 지금은 주석으로 처리 된 기능으로 가득 차서 정리가 필요합니다.

업데이트 1 :

내가 함께 몇 가지 예제 코드를 넣어하지만이 버그가 발생하지 않았다; 코드 스택을 테스트하기 위해 코드를 Drupal 모듈로 변환 할 수 있습니다. 그러나 버그를 echo $fileData으로 좁혔습니다. 코드는 다음과 같습니다.

function example_menu() { 
    $pages['mpicture/%'] = array(
    'title' => 'Picture handler', 
    'page callback' => 'example_picture', 
    'page arguments' => array(1), 
    'delivery callback' => 'example_deliver_png', 
    'access callback' => TRUE, 
    'type' => MENU_CALLBACK, 
); 
} 

function example_picture($fileID) { 
    // Point 1 
    example_output_file($fileID); 
} 

function example_deliver_png($content) { 
} 

function example_output_file($fileID) { 
    $statement = db_select('mfiles', 'f') 
    ->fields('f', array('fileType', 'fileSize', 'fileData', 'fileData64', 'lastModified')) 
    ->condition('fileID', $fileID, '=') 
    ->execute(); 

    if ($file = $statement->fetchAssoc()) { 
    header('Content-Type: ' . $file['fileType']); 
    // Point 2 
    header('Content-Length: ' . $file['fileSize']); 
    echo $file['fileData']; 
    } 
} 

이 방법은 작동하지 않습니다. 나는이에 Point 2을 변경하는 경우 :

// Point 2 
    header('Content-Length: ' . $file['fileSize']*4/3); 
    echo $file['fileData64']; 

을이 한 내 클라이언트 출력에 base64_decode을 실행으로, 올바르게 작동합니다. 그러나, 나는이 작업을 수행하는 경우 :

// Point 1 
    ob_start() 
    example_output_file($fileID); 
    $output = base64_encode(ob_get_clean()); 
    header('Content-Length: ' . strlen($output)); 
    echo $output; 

는 ... 동일한 base64_decode 보내고 클라이언트 작동하지 않습니다. 어떻게 그럴 수 있니?

네, 데이터를 두 번 저장하고 있습니다. 모든 단일 테스트에서 나는 $file['fileData'] 또는 base64_decode($file['fileData64'])을 사용하는지 여부는 중요하지 않으므로 데이터베이스 문제라고 생각하지 않습니다.

업데이트 2 :

그러나 호기심이 작동 :

// Point 1 
    ob_start() 
    example_output_file($fileID); 
    $output = base64_encode(trim(ob_get_clean())); 
    header('Content-Length: ' . strlen($output)); 
    echo $output; 

그래서, 나는 공백이 인쇄됩니다 위치를 찾으려고 지금 생각?

+0

[drupal.stackexchange.com] (drupal.stackexchange.com)에서 질문을 다시 보낼 수 있습니다. – stefgosselin

+0

이 시점에서 필자는 모든 헤더를 변경하고 출력 버퍼를 플러시하기 때문에 드루팔 (Drupal)의 결과가 엉망이되어서는 안된다. 또한 [drupal.stackexchange.com] (http://drupal.stackexchange.com/)에 무언가를 게시 할 때마다 답변이나 의견을 얻지 못했습니다. Drupal의 대부분의 사람들이 공식 지원 포럼에 대한 지원을 제공한다고 생각합니다. 어쨌든 나는 모든 가능성을 시험하고 다룰 수있는 Drupal만을 언급했다. – meustrus

+0

원시 이미지 바이너리를 보면 html PHP 오류가 있는지 여부를 확인할 수 있습니까? –

답변

1

나는 인턴을 질식시킬거야. 맹세 할게. 사실, 그건 표현이야 ...하지만 나는 화가 나있어.

그가 추가 한 새 파일에 끝에 공백이 있기 때문에 전체적인 문제가있었습니다. 간단한 "?> \ n". 이미지 핸들러를 포함하여 서버의 모든 페이지 앞에 공백이 인쇄됩니다. 공백 때문에 이미지가 손상되었습니다.

필자는 도덕적 인면에서는 파일 끝에 PHP 태그를 절대로 사용하지 않는 것이 좋습니다.

+0

이 게시물은 내 하루를 저장했습니다. 나는 똑같은 문제를 겪었고, 서둘러 무언가를 코딩함으로써 나 자신에게만 그렇게했다. 코딩의 15 분은 php 태그를 닫은 후 2 칸을 남겨두고 3 시간의 디버깅을 유도했습니다. Grr. –

+0

단지 3 시간이고 일주일 내내 기뻤습니다. 그리고 파일 끝에 PHP 태그를 닫을 필요는 없습니다. 이것은 완벽하게 유효하며 실제로 Zend 프로젝트의 스타일 (또는 이미 들었습니다.) :'') – meustrus

관련 문제