Java

Javaでdata URI (base64) を作る方法

Javaでファイルからdata URIを生成する方法のメモです

data URIとは

data URIとはメディアデータなどをbase64エンコードしたもので、以下のようなやつです

data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28y・・・・==

HTMLでは、

<image src="data:image/png;base64,AAAAIGZ0eXBpc29tAAAC・・・">

<video src="data:video/mp4;base64,AAAAIGZ0eXBpc29tAAAC・・・">

のようにsrc指定することが可能です。

1.ファイルの種類をあらわす MIMEタイプ を調べる

ファイルのMIMEタイプを調べる。

File file = new File("movie.mp4");

String contentType = Files.probeContentType(file.toPath());

2.ファイルの中身をbyte[]配列にすべて読み込む

byte[] data = Files.readAllBytes(file.toPath());

3.byte[]配列をbase64にエンコードする

  • Java7のアプローチ
 String base64str = DatatypeConverter.printBase64Binary(data);
  • Java8のアプローチ
 String base64str = Base64.getEncoder().encodeToString(data);

4.data URI書式にする

以下の書式にする

data:[<MIME-type>][;charset=<encoding>][;base64],<data>
StringBuilder sb = new StringBuilder();
sb.append("data:");
sb.append(contentType);
sb.append(";base64,");
sb.append(base64str);

ソースコード全文

ToDataURI.java
package org.example;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;

import javax.xml.bind.DatatypeConverter;

public class ToDataURI {

    public static void main(String[] args) throws IOException {

        // 変換元のファイル
        File file = new File("movie.mp4");

        // ファイルのコンテンツタイプをしらべる
        String contentType = Files.probeContentType(file.toPath());

        // ファイル内容をbyte[]に読み込む
        byte[] data = Files.readAllBytes(file.toPath());

        // byte[]をbase64文字列に変換する(java7)
        String base64str = DatatypeConverter.printBase64Binary(data);

        // byte[]をbase64文字列に変換する(java8)
        // String base64str = Base64.getEncoder().encodeToString(data);

        // data URIを作る
        StringBuilder sb = new StringBuilder();
        sb.append("data:");
        sb.append(contentType);
        sb.append(";base64,");
        sb.append(base64str);

        // 結果を表示
        System.out.println(sb.toString());

    }
}

実行すると、data URIできあがり

data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wN・・・以下略