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・・・以下略