웹스쿨

문자열 안의 모든 img 태그안의 src 이미지를 base64 로 치환하기 본문

개발 경험 Tip/PHP

문자열 안의 모든 img 태그안의 src 이미지를 base64 로 치환하기

마스터욱 2023. 3. 31. 00:20
반응형

상황설명을 드리겠습니다.

얼마전 티스토리 API 와 연동을 했습니다.

제 사이트의 게시글을 티스토리에 전송하려는 작업이었습니다.

순조롭게 다 진행이 되었는데, 마지막에 문제가 발생했습니다.

 

이미지가 있는 게시글의 경우, 이미지 경로가 제 사이트의 경로로 잡혀있다보니 티스토리로 게시글을 전송했을때 이미지에 엑박이 뜨는문제였습니다.

고민을 해보았습니다.

 

게시글을 전송하기 전에 img 경로에 url 을 붙여버릴까?

이렇게 하면 이미지가 출력되긴 출력된다. 다만 이미지 트래픽을 모두 내 사이트가 부담하게 됩니다.

안 그래도 가난하고 후달리는 삶에, 호스팅까지 업그레이드 시켜야 하겠느냐? 라는 부담감이 발생하기 시작했습니다.

 

그러다가 문득 떠오르는 아이디어!

img 를 base64로 만들어서 전송해버리자!

관대한 티스토리는 이해해줄것이다!

 

그런데 작업이 쉽지는 않았습니다.

그넘의 정규식, 규식이형이랑과의 데이트를 해야하기 때문입니다.

하지만~, 역시 굴링이형은 우리를 실망시켜주지 않았습니다.

굴링이형에게 물어보니 깃허브(github)에 버젓이 개발된 소스코드가 존재했습니다.

개발시간을 훨씬 단축시켜준 구글형님과 깃허브님께 이 영광을 바칩니다.

아래는 소스코드입니다.

 

사용자는 "절대경로" 와 "내용" 만 본인의 변수로 수정하여 사용하시면 됩니다.

 

그런데 네이버는 지가 알아서 base64로 만들어 버린던데, 이런거 보면 네이버가 편리하긴 편리해~

 

  1. //이미지를 base64 로 모두 인코딩하자.
  2. $offset = 0;
  3. $srcDir = 절대경로;
  4. $template_content = 내용;
  5. while (preg_match('/<img src="([^"]*)"/i'$template_content$match, PREG_OFFSET_CAPTURE, $offset) >= 1) {
  6.     $matchTag = $match[0][0];
  7.     $matchOffset = $match[0][1];
  8.     $imgFile = $srcDir.'/'.$match[1][0];
  9.     $ext = pathinfo($imgFile, PATHINFO_EXTENSION);
  10.     if (!file_exists($imgFile)) {
  11.         echo "Unable to find image file {$imgFile}\n";
  12.         return;
  13.     }
  14.     $img_tag = "<img src='data:image/".$ext.";base64," . base64_encode(file_get_contents($imgFile)) . "'";
  15.     // Replace the IMG src link tag with IMG embed content
  16.     $template_content = substr_replace($template_content$img_tag$matchOffsetstrlen($matchTag));
  17.     // offset for next loop
  18.    $offset = $matchOffset + strlen($img_tag);
  19. }
  20. //echo $template_content;exit;

이 게시글은
https://webschool.kr/?v=board_view&board_key=7&idx=604
에서 작성한 글입니다. 소스코드의 경우 해당 블로그에서 이뿌게 노출이 되지 않을 수 있사오니, 위 링크로 들어오셔서 보시길 바랍니다.

반응형