我有一些自定义代码可以将.HTML文件传送到服务器的磁盘,我希望能够修改该代码,以便将所有图像引用从普通URL(即http://example.com/image.jpg
)更改为Base64编码的数据URI。 / p>
如何在Java中解析此输出(.html文件)并将所有img src更改为数据URI?
HTML基本上是一封电子邮件,因此可能就像:
<html>
<body>
<img src="http://www.google.co.uk/images/nav_logo242.png">
</body>
</html>
它需要用Base64数据URI替换所有img src=
。
我的输入HTML电子邮件已经作为我们的交付流程的一部分进行了Base64编码,因此我只能解码和重新编码。我完全不知道如何将参考图像换成数据URI。
更新
我已经取得了一些进展,现在这需要并输入和吐出我所追求的东西。我遇到的问题是网站何时是HTTP网站,然后必须重定向到HTTPS。这使得代码失败了。
package embedimages;
import com.github.kevinsawicki.http.HttpRequest;
import java.io.ByteArrayOutputStream;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
public class EmbedImages {
public static void main(String[] args) throws java.lang.Exception {
boolean debug = false;
String HTMLSTring = "<!DOCTYPE html>" + "<html>" + "<head>" + "<title>Example</title>" + "</head>" + "<body>" + "<table><tr><td><h1>HelloWorld</h1></tr>" + "</table>" + "<img src=\"http://ichef.bbci.co.uk/news/660/cpsprodpb/025B/production/_85730600_monkey2.jpg\">" + "</body>" + "</html>";
if (debug) {
System.out.println(HTMLSTring);
}
Document doc = Jsoup.parse(HTMLSTring, "UTF-8");
for (Element element : doc.select("img")) {
String src = element.attr("src");
if (debug) {
System.out.println("Parsed src is: " + src);
}
if (src != null && !src.startsWith("data:")) {
HttpRequest request = HttpRequest.get(src);
request.trustAllCerts();
request.trustAllHosts();
if (debug) {
System.out.println("Header is: " + request.headers());
}
if (debug) {
System.out.println("Status is: " + request.code());
}
if (request.ok()) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
request.receive(baos);
String mimeType = request.contentType();
if (debug) {
System.out.println(mimeType);
}
byte[] b = baos.toByteArray();
String encoded = HttpRequest.Base64.encodeBytes(b);
String dataURI = "data:" + mimeType + ";base64," + encoded;
if (debug) {
System.out.println(dataURI);
}
element.attr("src", dataURI);
} else {
if (debug) {
System.out.println("FAIL");;
}
}
doc.outputSettings().prettyPrint(true);
if (debug) {
System.out.println(doc.html());
}
}
}
}
}