2012-01-11 2 views
3

이미지를 생성하는 데 PHP를 사용하고 있는데 문제가 없습니다. 하지만이 이미지를 표시하는 데 문제가 있습니다.길이가 초과 된 인라인 이미지 생성

내 이미지 생성기는 이미지 생성을 위해 많은 양의 매개 변수와 데이터를 필요로하는 PHP 파일입니다. GET 컨테이너를 사용하면 생성자로 전달해야하는 과도한 양 때문에 POST 요청을 통해 데이터가 전송됩니다. 이 요청의 결과는 원본 이미지 데이터입니다.

내 이미지를 표시

$result = post_request('http://myurl.com/graphx/generator.php', $data); 
if($result['status'] == 'ok') { 
    echo "<img src=\"data:image/png;base64,". 
     base64_encode($result['content'])."\"/>\n"; 
} 

을 사용하고 있습니다. 이것은 매우 작은 이미지에도 적용되지만 더 커지면 (예 : 300px * 300px) 이미지가 더 이상 표시되지 않습니다 (어딘가에 잘린 것처럼 보임).

내 접근 방식이 합리적입니까?

크기 문제에 대한 해결 방법이 있습니까?

업데이트 : 발전기 파일로 이미지를 저장 할 때 내가 원하는대로

는, 생성 된 파일은 이미지가 포함되어 있습니다. 는 GET-발전기로 내 발전기를 변환하는 경우 또한, 다음과 같은 코드가 제대로뿐만 아니라 작동합니다

$data = http_build_query($data); 
echo "<img src=\"http://myurl.com/graphx/get_generator.php?{$data}\"/>\n"; 

그래서 확실히 POST 요청 또는 base64 형식으로 변환 중 하나에 문제가 될 것으로 보인다. 표시된대로 POST 요청을 사용하고 있습니다. here.

+0

더 큰 이미지에 대한 $ 결과의 출력은 무엇입니까? 이 경우 콘텐츠 키를 가져올 수 있습니까? – Stewie

+0

@Stewie 콘텐츠 키를 가져올 수 있으며 'base64'데이터가 포함되어 있지만 특정 길이로 제한된 것으로 보입니다. – nijansen

답변

3

나는 당신의 페이지는 다음과 같이 구성 할 필요 좋을 것 :

메인 페이지 :

<img src="imageproxy.php" /> 

imageproxy.php :

<?php 
$result = post_request('http://myurl.com/graphx/generator.php', $data); 
header('Content-type: image/png'); 
if($result['status'] == 'ok') { 
    echo $result['content']); 
} else { 
    readfile('error_message_image.png'); 
} 

대신 데이터 URI를 함께 작동하도록 노력하고 길이 제한을 설정하면 프록시 스크립트에서 실제 원시 이미지 데이터를 출력하고이를 클라이언트 측 html의 이미지로 처리 할 수 ​​있습니다.

+0

Brilliant. 이것은 내가 바라던 바로 그 아이디어입니다. – nijansen

1

왜 매개 변수를 Base64로하고, GET 요청에 그것을 넣어 간단하지 않습니다

<img src="/path/to/php.php?p=eyJ0aGlzIjoiaXMiLCJhIjoiYmVhdXRpZnVsIiwic2V0Ijoib2YiLCJwYXJhbWV0ZXJzIjoiISEifQ==" /> 

그런 다음 php.php의 base64_decode에의 ($ p)의 이미지를 반환합니다. 당신은 모든 시간을 다시 작성하지 않아도 더 나은 php.php에

은 로컬뿐만 아니라 이미지를 캐시 아마도 X-sendfile을 아파치 ( https://tn123.org/mod_xsendfile/)의 모드 등을 사용

편집 :

정확히 얼마나 많은 매개 변수를 여기에서 말하는지 모르겠습니다. What is the maximum length of a URL in different browsers?을 보시면 URI가 약 2000 자 정도라는 것을 경험을 통해 알 수 있습니다.

따라서 Base64로 인코딩 된 문자열이 안전하지 않은지 여부에 따라 다릅니다. 그렇지 않으면 인코딩의 대체 방법을 생각할 수 있습니다. 아마도 yEnc 또는 base85일까요?

로컬 스토리지 (예 : RDBMS)에 직렬화 된 객체 (필요한 매개 변수 포함)를 저장하고 ID와 연결하여 해당 ID를 전달할 수 있습니다. php.php가 id를 얻었을 때 저장소에서 찾아서 매개 변수를 검색하여 이미지를 생성합니다.

+0

저는 특히 첫 번째 제안에 관심이 있습니다.이 도움이 될까요? 나는 솔직히 HTTP를 통한 GET 요청에 능숙하지는 않지만'base64 '로 인코딩 할 때 무제한의 데이터를 보내 단일 매개 변수로 보낼 수 있습니까? – nijansen

+0

여전히 실패합니다. GET 쿼리는 제한된 길이를 가지며 '큰'이미지를 줄 바꿈합니다. –

+0

공간이 부족하여 @MarcB와 nijansen에 모두 답장하기 위해 내 게시물을 편집합니다. – mobius

1

http://en.wikipedia.org/wiki/Data_URI_scheme에 따르면 IE 8 (및 아마도 지원하는 경우 아래)은 데이터 URI를 최대 길이 32KB로 제한합니다. 이것은 당신이 무엇을 보내고 있든 처음 32k 만 읽으면 당신이보고있는 것일 수 있습니다.

+0

매우 유용한 정보입니다. 그러면이 32KB 한도를 어떻게 넘을 수 있습니까? – nijansen

+0

마크 B의 답변이 아마도 최선의 방법이라고 생각합니다. 지금하고있는 일을하고 코드를 추출하여 이미지가있는 다른 페이지에 코드를 추출하여 이미지를 반환 할 수 있습니다. – Chris