Data URI 및 MHTML 초급

12644 단어 html
Data URI – 이미지를 코드로 변환하여 웹 페이지에 삽입

Data URI


Data URIRFC 2397가 정의한 작은 파일을 문서에 직접 삽입하는 방안이다.작은 데이터를 웹 페이지에 직접 삽입하여 외부 파일에서 다시 불러올 필요가 없도록 하는 것이 목적이다. 현재 IE8, Firfox, Chrome, Opera 브라우저는 모두 이런 작은 파일의 삽입을 지원한다.다음 구문을 사용하여 작은 파일을 지정된 인코딩으로 만들어 페이지에 직접 포함할 수 있습니다.
 data:[<MIME-type>][;charset="<encoding>"][;base64],<data> 
  • MIME-type: 포함된 데이터의 MIME를 지정합니다.그 형식은 [type]/[subtype]; parameter이다. 예를 들어 png 그림에 대응하는 MIME는 이미지/png이다.parameter는 추가 정보를 지정할 수 있으며, 더 많은 경우text/plain과text/htm 등의 문자 인코딩 방식을 지정하는charset 인자입니다.기본값은 text/plain입니다.charset=US-ASCII.
  • charset="": 지정한 데이터의 문자 집합
  • base64: 뒤에 있는 데이터의 인코딩은 base64라고 성명합니다. 그렇지 않으면 데이터는 백분율 인코딩(즉 내용에 대한urlencode)을 사용해야 합니다. 기본 인코딩 방안은base64에서 지정합니다. 만약 절약하지 않으면 데이터는 URL Encoding[2]를 사용하여 유효한 ASCII 형식으로 변환해야 합니다.이 기본값인 경우 기본 매개변수는 text/plain 유형이고 문자 세트는 US-ASCII 스키마
  • base64는 간단하게 말하면 8-bit 데이터를 표준 ASCII 문자로 번역한다. 인터넷에는 무료base64 인코딩과 디코딩 도구가 많은데 PHP에서 함수base64 를 사용할 수 있다echo base64 와 같이 encode()를 인코딩합니다.encode (file get contents ('wg.png ') 는 Url은 텍스트 기반 프로토콜이기 때문에gif/png/jpeg 같은 2진법은base64로 인코딩해야 합니다.베이스64를 도입하면 임의의 데이터 형식을 지원할 수 있다는 얘기다.
  • [1] MIME: http://zh.wikipedia.org/wiki/MIME
  • [2] URL Encoding: http://www.w3schools.com/TAGS/ref_urlencode.asp
  • [3] MHTML: http://en.wikipedia.org/wiki/Mhtml

  • 지난 세기HTML4.01 Data Uri 시나리오 도입까지 지금까지IE6 및 IE7을 제외한 모든 메인스트림 브라우저에서 지원였지만 IE8의 Data Uri 지원에는 제한이 있음object(그림만 있을 때),img,input type=image,link와 CSS의 URL만 지원했고 데이터량은 32K 이상일 수 없습니다.

    이점:

  • HTTP 요청 감소는 TCP 연결 소모와 같은 도메인 이름의 브라우저의 합병수 제한이 없다.
  • 작은 파일의 대역폭은 줄어듭니다.인코딩 후 데이터 양은 증가하지만 http 헤더는 감소한다. http 헤더의 데이터 양이 파일 인코딩의 증가량보다 크면 대역폭을 낮출 수 있다.
  • HTTPS 사이트에서 HTTPS와 HTTP를 혼용하면 안전 알림이 있을 수 있지만 HTTPS는 HTTP에 비해 비용이 많이 들기 때문에 Data URI의 장점이 더욱 뚜렷하다.
  • 멀티미디어 페이지 전체를 파일로 저장할 수 있습니다.

  • 단점:

  • 중복 이용이 불가능하고 같은 문서에 같은 내용을 여러 번 적용하면 여러 번 반복해야 하며 데이터량이 대량으로 증가하여 다운로드 시간이 증가한다.
  • 혼자서 캐시할 수 없기 때문에 문서를 다시 불러올 때도 다시 불러옵니다.
  • 클라이언트는 다시 디코딩하고 표시해야 하기 때문에 약간의 소모를 증가시켰다.
  • 데이터 압축이 지원되지 않아서base64 인코딩은 1/3 크기가 증가하고urlencode 이후에는 데이터량이 더 많아집니다.
  • 안전 소프트웨어의 필터에 불리하고 일정한 안전 위험도 존재한다.

  • MHTML


    MHTML은 MIME HTML (Multipurpose Internet Mail Extension HTML)의 줄임말로 RFC 2557가 정의한 멀티미디어 페이지의 모든 내용을 같은 문서 솔루션에 저장하는 것이다.이 방안은 마이크로소프트가 IE5로부터 제출한 것이다.0부터 지원, 그리고 Opera 9.0도 지원됩니다. Safari는 파일을 로 저장할 수 있습니다.mht(MHTML 파일의 접미사) 형식이지만 표시할 수는 없습니다.
    MHTML과 Data URI는 비교적 유사하고 더욱 강력한 기능과 복잡한 문법이 있으며 Data URI에서'중복 이용될 수 없다'는 단점이 없지만 MHTML은 사용하기에 유연하고 편리하지 않다. 예를 들어 자원에 대한 인용 URL은 mht 파일에서 상대적인 주소가 될 수 있고 그렇지 않으면 절대적인 주소가 되어야 한다.hedger《Cross Browser Base64 Encoded Images Embedded in HTML》에서 IE에 대한 해결 방안을 상대적인 경로로 사용한 것은 Content-type:message/rfc822가 IE를 MHTML에 따라 해석하도록 성명했기 때문이며, 수정하지 않으면 MHTML 프로토콜을 사용해야 하며, 이럴 때는 절대 경로를 사용해야 한다《MHTML – when you need data: URIs in IE7 and under》.

    응용 프로그램


    데이터 URI와 MHTML의 결합은 모든 주류 브라우저를 완전하게 해결할 수 있다. 캐시와 중복 이용이 불가능한 결함으로 인해 페이지에서 직접 사용하기에는 적합하지 않지만 CSS와 자바스크립트 파일에서 그림을 적절하게 사용하는 것이 매우 우수하다.
  • 요청 수를 크게 줄였고 현재 대형 사이트의 CSS는 대량의 사진 자원을 인용했다.
  • CSS와 자바스크립트는 모두 캐시될 수 있고 데이터의 캐시를 간접적으로 실현할 수 있다.
  • CSS를 통해 Data URI의 재활용 문제 해결
  • 고별CSS Sprites에서 CSS 스프릿스의 출현은 요청 수를 줄이기 위한 것이지만 불확실한 상황에서 이상을 가져오다 외에 CSS 스프릿스는 인위적인 이미지 통합이 필요하다. 합병 도구가 있어도 인위적으로 효과적인 퍼즐 맞추기에 많은 시간을 소모하고 유지보수에 어려움을 겪어야 한다.일정한 디자인 원칙을 따르면 CSS Sprites를 완전히 버리고 CSS를 작성할 수 있다. 마지막으로 도구를 사용하여 서버에 업로드하는 단계에서 그림을 Data URI와MHTML로 변환할 수 있다. 예를 들어 《데이터-uri를 이용하여 스타일시트와 그림을 통합하기》에서python으로 이루어진 도구를 사용하면 많은 시간을 절약할 수 있다.
  • base64 인코딩은 이미지 파일을 1/3 증가시켰고 데이터 URI와MHTML을 동시에 사용하면 2/3 증가했지만 CSS와 자바스크립트는 gzip 압축를 사용할 수 있고 2/3의 데이터를 절약할 수 있기 때문에 gzip을 사용하여 압축한 최종 데이터량Content-type은 최종 데이터량이 감소했다.

  • 1) 웹 페이지에 표시되는 표준적인 방법은 로 바꾸어 말하면 우리는 이미지 파일의 내용을 파일에 내장하여 HTTP 요청을 절약했다.
    2) CSS에서 body {background-image: url("data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAQAAAADCAAIAA7ljmRAAAAAAAAAGElEQQIW2P4DwcMDAxAfBvMAhEQMYgcaCEHG8ELxtbPAAAAAELFTkSuQmCC") 사용)
     
    CSS에서 Data URI와MHTML을 쉽게 실현하기 위해 Data URI &MHTML 생성기를 썼습니다. 이를 이용하여 생성Data URI & MHTML 적용 인스턴스을 보실 수 있습니다.
    CSS 파일에서 MHTML을 사용할 때 URL은 절대 경로를 사용해야 하기 때문에 매우 원활하지 않기 때문에 CSS expression을 사용하여 해결할 수 있다(DEMO. 예를 들어 다음과 같다.
    /* http://old9.blogsome.com/2008/10/26/css-expression-reloaded/
    
      http://dancewithnet.com/2009/07/27/get-right-url-from-html/
    
    */
    
      *background-image:expression(function(ele){
    
        ele.style.backgroundImage = 'url(mhtml:' +
    
             document.getElementById('data-uri-css').getAttribute('href',4) +
    
             '!03114501408821761.gif)';
    
       }(this));

    IE6 & IE7 호환
    CSS Hacks를 통해 MHTML[3] 솔루션을 결합하여 IE6과 IE7이 DataURI를 지원하지 않는 상황을 해결합니다.
    /*
    
    Content-Type: multipart/related; boundary="_ANY_SEPARATOR"
    
     
    
    --_ANY_SEPARATOR
    
    Content-Location:somestring
    
    Content-Transfer-Encoding:base64
    
     
    
    iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAA[...snip...]SuQmCC
    
    --_ANY_SEPARATOR--
    
    */
    
     
    
    #myid {
    
      /* normal browsers */
    
      background-image: url("data:image/png;base64,iVBORw0[...snip...]");
    
      /* IE < 8 targeted with the star hack */
    
      *background-image: url(mhtml:http://phpied.com/mhtml.css!somestring); 
    
    }
    /*Content-Type: multipart/related; boundary="_"  
    --_ Content-Location:<identifier> Content-Transfer-Encoding:base64
    <data>
    */ selector{*background:url(mhtml:<stylesheet>!<identifier>);}

    여기서::구분자 지정(임의의 문자열)
    identifier: 내용 위치 식별자 지정 스타일시트 절대 경로 지정
    전체 코드 예
    /*
    
    Content-Type: multipart/related; boundary="_ANY_STRING_WILL_DO_AS_A_SEPARATOR"
    
     
    
    --_ANY_STRING_WILL_DO_AS_A_SEPARATOR
    
    Content-Location:locoloco
    
    Content-Transfer-Encoding:base64
    
     
    
    iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7ljmRAAAAGElEQVQIW2P4DwcMDAxAfBvMAhEQMYgcACEHG8ELxtbPAAAAAElFTkSuQmCC
    
    --_ANY_STRING_WILL_DO_AS_A_SEPARATOR
    
    Content-Location:polloloco
    
    Content-Transfer-Encoding:base64
    
     
    
    iVBORw0KGgoAAAANSUhEUgAAABkAAAAUBAMAAACKWYuOAAAAMFBMVEX///92dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYvD4PNAAAAD3RSTlMAACTkfhvbh3iEewTtxBIFliR3AAAAUklEQVQY02NgIBMwijgKCgrAef5fkHnz/y9E4kn+/4XEE6z/34jEE///A4knev7zAwQv7L8RQk40/7MiggeUQpjJff+zIpINykbIbhFSROIRDQAWUhW2oXLWAQAAAABJRU5ErkJggg==
    
    --_ANY_STRING_WILL_DO_AS_A_SEPARATOR--
    
    */ 
    
    #test1 {
    
      background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7ljmRAAAAGElEQVQIW2P4DwcMDAxAfBvMAhEQMYgcACEHG8ELxtbPAAAAAElFTkSuQmCC"); /* normal */
    
      *background-image: url(mhtml:http://phpied.com/files/mhtml/mhtml.css!locoloco); /* IE < 8 */
    
    } 
    
    #test2 {
    
      background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUBAMAAACKWYuOAAAAMFBMVEX///92dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYvD4PNAAAAD3RSTlMAACTkfhvbh3iEewTtxBIFliR3AAAAUklEQVQY02NgIBMwijgKCgrAef5fkHnz/y9E4kn+/4XEE6z/34jEE///A4knev7zAwQv7L8RQk40/7MiggeUQpjJff+zIpINykbIbhFSROIRDQAWUhW2oXLWAQAAAABJRU5ErkJggg=="); /* normal */
    
      *background-image: url(mhtml:http://phpied.com/files/mhtml/mhtml.css!polloloco); /* IE < 8 */
    
    } 
    
    div {width: 100px;  height: 100px;  font: bold 24px Arial;}

      (1 + 1/3) * 2 * (1/3) = 8/9
    http://dancewithnet.com/lab/2009/data-uri-mhtml/create.php
     
    Nicholas C. Zakas DataURI 자동화 도구 에서 온 명령줄 형식:
       java -jar datauri-x.y.z.jar -o    
     
     

    좋은 웹페이지 즐겨찾기