램프 환경에서 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;
그래서, 나는 공백이 인쇄됩니다 위치를 찾으려고 지금 생각?
[drupal.stackexchange.com] (drupal.stackexchange.com)에서 질문을 다시 보낼 수 있습니다. – stefgosselin
이 시점에서 필자는 모든 헤더를 변경하고 출력 버퍼를 플러시하기 때문에 드루팔 (Drupal)의 결과가 엉망이되어서는 안된다. 또한 [drupal.stackexchange.com] (http://drupal.stackexchange.com/)에 무언가를 게시 할 때마다 답변이나 의견을 얻지 못했습니다. Drupal의 대부분의 사람들이 공식 지원 포럼에 대한 지원을 제공한다고 생각합니다. 어쨌든 나는 모든 가능성을 시험하고 다룰 수있는 Drupal만을 언급했다. – meustrus
원시 이미지 바이너리를 보면 html PHP 오류가 있는지 여부를 확인할 수 있습니까? –