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

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

조회 1,352회 댓글 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등 요소가 모두 정확있지 않으면 받았을때 다른 경우가 있다

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

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

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


  • 페이스북으로 공유
  • 트위터로  공유
  • 구글플러스로 공유
전체 97건 1 페이지
  • profile_image 중복된 처리를 제외하고자 할때 일정 부분 쿠키로 가지고 있다가 비교해서 동일한 것은 처리 하지 않기 위한것입니다.이것을 쿠키를 이용하는 방법이 있고 요즘은 로컬스토리지를 이용하는 방법도 있겠습니다. 특정 게시물의 번호나. 방문자의 로그를 저장하여 처리 하는 경우는 중복 처리 방지를 위한 간단한 방식 입니다.게시물의 경우 중복제외 처리를 하지 않으면 들쑥 날쑥 하지만 최고 30% 넘게 차이나는 경우도 있었습니다.  <!DOCTYPE html…
  • 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…