html2canvas 이미지 서버전송(ajax post) > javascript
javascript

html2canvas 이미지 서버전송(ajax post)

조회 1,315회 댓글 0건

많이 사용하는 html을 이미지로 만들어 사용할 수 있는 라이브러리 입니다.

사용해보니 제가 본것에서는 아래와 같은 것이 있었습니다.

- 화면에 보이는것하고 다르게 나오는 경우가 있으니 반드시 확인 필요

- 외부 이미지 주소 캡처가 안되더라 입니다.(아래 샘플 확인)

- 어느분이 1만 픽셀 넘는것은 안되드라에 대한 부분이 있는데 많은 양의 경우 별도 테스트 필요


<?php
if ( $_POST['mode'] == "img_upload" )
{
  $img_base64   = $_POST['img_base64'];
  $img          = str_replace('data:image/jpeg;base64,', '', $img_base64 );
  $img          = str_replace(' ', '+', $img);
  $img_data     = base64_decode($img);

  $fExt         = ( stristr($img_base64, 'data:image/jpeg') ) ? 'jpg':'png';
  $imgFile      = 'upfile/test.' . $fExt;
  $imgSize      = file_put_contents($imgFile, $img_data);

  $oJson        = (object)[];
  $oJson->imgSize   = $imgSize;
  $oJson->imgFile   = $imgFile;
  $oJson->imgXY     = $_POST['img_size_xy'];
  $json_data    = json_encode($oJson);
  echo $json_data;
  exit;
}
?>
<!DOCTYPE html>
<html lang="ko">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>ajax file upload </title>
  <script src="https://code.jquery.com/jquery-3.6.0.js"></script>
</head>

<body>
  <div id="html_canvas_test" style="border: 1px solid #ff1212;">
    <input type="file" id="btn_file1">
    <img src="googlelogo_color_272x92dp.png">
  </div>
  <p></p>
  <button id="btn_test">버튼 클릭</button>

</body>
</html>

<script>

$(document).ready(function() {

  $( "#btn_test").click(function(e)
  {
    // jpg로 주면 안되며 명확하게 jpeg로 줘야 한다
    html2canvas( $("#html_canvas_test")[0] ).then(function(canvas) {
      var img_base64  = canvas.toDataURL("image/jpeg");
      // console.log(img_base64);
      ajax_file_upload( img_base64 );
    });

    // 투명 png 테스트 된것
    // html2canvas( $("#html_canvas_test")[0], {backgroundColor: null}
    // ).then(function(canvas) {
    //   var img_base64  = canvas.toDataURL("image/png");
    //   ajax_file_upload( img_base64 );
    // });

  });

  /**
   * ajax post
   *
   * @param mixed img_base64
   *
   * @return [type]
   *
   */
  function ajax_file_upload( img_base64 )
  {
    // 단순 크기를 보기 위한것
    let img_width  = $('#html_canvas_test').outerWidth();
    let img_height = $('#html_canvas_test').outerHeight();
    let img_size_xy= img_width + 'x' + img_height;
    console.log('img size:', img_size_xy);

    //
    let form = new FormData();
    form.append( "mode", 'img_upload' );
    form.append( "img_base64", img_base64 );
    form.append( "img_sizeXY", img_size_xy );
    console.log(img_size_xy);

    jQuery.ajax({
      url : "hh.php"
      , type : "POST"
      , processData : false
      , contentType : false
      , data : form
      , success:function(response) {
        // console.log(response);

        resultData  = JSON.parse(response);
        console.log(resultData);
      }
      ,error: function (jqXHR) {
        console.log(jqXHR.responseText);
      }
    });
  }

});

</script>


위에서 png 부분에서 투명으로 하고 싶으면 예제 처럼 옵션을 추가해 줘야 합니다. 그렇지 않으면 투명이 아니라 힌색으로 디폴트로 채워집니다. 현재 테스트한 최신 버전에선 그렇습니다.

그리고 이미타입에서 image/jpg 가 아닙니다. jpeg로 반드시 표준에 맞게 해줘야 합니다. 그래야 정상적으로 작동이 됩니다. 이 경우는 없는 이미지 타입이라서 png로 되었던 기억입니다.


서버로 보낼때는 파일로 보내는것이 아니기 때문에 ajax에서 enctype에 대한 언급은 없습니다.

post로 넘기고 이것은 base64 이기 때문에 서버에서 받아서 불필요한것 삭제 후 디코딩하여 사용 합니다.

PHP의 예에서는 확장자면 있고 컨텐츠 타입에 대한 부분은 png 일때는 그에 맞게 변경해 줘야 합니다

결과를 json으로 출력하기 때문에 개발자 도구에서 보면 json 결과를 볼 수 있습니다.


f08f4a3d7c3248096854e2720bc04fa9_1671329142_0445.png
 


***** 추가 사항 *****

- 백그라운드나 iframe 까지

https://fronteer.kr/bbs/view/113 


- 스크롤 들어가면 짤리는 경우가 있다 이런 경우 css로 화면을넓게

- 뭔가 원하는 대로 안될때 proxy를 사용하는 경우가 있다


https://myhappyman.tistory.com/156

- 다운받으려는 특정요소는 width, height등 요소가 모두 정확있지 않으면 받았을때 다른 경우가 있다

   (비었거나 짤렸거나 늘어나거나 줄어들거나 ...)

- 외부 데이터를 받아 오는 경우 정상적으로 안된다

- 높이가 바디 영역보다 크면 문제가 될 수 있다


  • 페이스북으로 공유
  • 트위터로  공유
  • 구글플러스로 공유
전체 96건 1 페이지
  • profile_image 블로그에 있는 datepicker는  안되는것이 많아서 사용할 일이 있어서 완성한것 올립니다.jquery는 버전이 다르면 안될 수 있으니 버전을 맞우는것이 중요하며 아래 순서도 중요합니다.jquery를 이용하기 때문에 jquery-ui가 아래에 있어야 한다는 것입니다. 그리고 jquery-ui 압축 파일을 받으면 아래와 같이 CDN 이용하지 않고 사이트에 올려 놓고 사용할 수 있으며 압축 파일 안에 아래 cdn 링크 걸린 모든 파일과 더불어 필…
  • profile_image Node Express는 Node.js와 Express.js를 결합하여 웹 애플리케이션 개발에 사용되는 프레임워크입니다. 이를 통해 비동기적인 서버 측 코드 작성과 HTTP 요청 및 응답 처리 등 다양한 웹 개발 작업을 보다 쉽게 처리할 수 있습니다.  1) 간단하게 띄울 프로그램을 하나 준비 서버가 잘 작동하는지 확인을 할 수 있는 간단한 프로그램을 준비 하도록 합니다.자신이 하는것이 디비커넥션이 들어가게 되면 이 부분도 간단하게 CRUD 프…
  • profile_image -g 옵션을 주어 글로벌로 설치한것이 아닌데 현재 디렉토리에 node_modules이 없고 다른곳에 설치 된경우는 아래처럼 초기화하면 package.json 파일이 생성 되고 현재 디렉토리에 node_modules 디렉토리가 생기면서 설치 됩니다. 아래와 같이 초기화 후 설치 하면 됩니다.  npm init -y  npm install express 그리고 초기화 했는데 안되는 경우는 시스템 로그인할때 홈 디렉토리나 또는 기본적으로 있어야할 스…
  • profile_image 실제 파일은 있는데 없는다는 메시지가 나올 경우는 PATH 설정 값을 확인해 봐야 합니다.만약 whereis env 했는데 있다면 로그인할 때 실행되는 파일에 PATH 설정을 추가해 주면 됩니다./usr/local/nodejs/bin/npm install yarn/usr/bin/env: node: 그런 파일이나 디렉터리가 없습니다위와 같은 오류가 발생 하는 경우는 경로를 추가해 주면 된다.vim /etc/bashrcexport PATH=$PAT…
  • profile_image 프로그래머가 아니라 일반인이면 PDF 페이지번호 추가해주는 사이트가 있으니 아래를 참고하시면 됩니다.https://tools.pdf24.org/ko/add-page-numbers#s=1687481961009여기선 nodejs와 pdf-lib 설치에 대해선 언급하지 않습니다.아래는 간단한 소스 입니다.PDF파일에 페이지 번호가 없어서 인쇄하는데 있어 페이지수가 적으면 문제가 안되지만 수십페이지만 되어도 읽을때 문제가 될 수 있습니다. 페이지가 바…
  • profile_image chat GPT API를 통해서 물어본것에 대한 테스트 인데요.잘 되네요.별도의 모듈설치 없이 그냥 실행 되었습니다. 제가 전에 다른것 하면서 설치 되었는지는 확인 안해 봤습니다.  // zlib 모듈을 불러온다.  const zlib = require('zlib');  const fs = require('fs');  // 압축할 문자열  const str = '압축할 문자열';  // gzip으로 압축한다.  zlib.gzip(str, (er…
  • profile_image 파일저장이나 또는 가져올때등 상대경로로 호출 하는 경우도 있지만때론 전체 경로를 알아야 되는 경우가 있습니다.그럴때 현재 디렉토리 기준으로 처리하면 좋은때 이럴때 사용 합니다.  // 현재 디렉토리   const _DIR_   = process.cwd();  php의 __DIR__ 과 같은 역활 입니다.확인 결과 위 예제는 잘 되는 것입니다. 현재 V16 버전에서 문제 없었습니다.* 사용한곳은 아래 입니다. 파일을 저장할때 유용합니다.  [no…