I needed a function to convert an arbitrary file (ie. binary) into a base64 encoded stream in order to put it into an atom+xml http post to feed Alfresco document management system. Luckily I found MLJAM, which allows you to embed Java into xquery. I found the needed Java snippet here, and then put it together - the code below should work in the MarkLogic Query console, just set the filename parameter accordingly.
Ultimately MarkLogic should have xdmp:base64-encode work on a binary node, then you could simply do xdmp:base64-encode(xdmp:external-binary("/some/path/image.png"))!
xquery version "1.0-ml";import module namespace jam = "http://xqdev.com/jam" at "/MarkLogic/jam.xqy";let $code := <code><![CDATA[import org.apache.commons.codec.binary.Base64;private String encodeFileToBase64Binary(String fileName)throws IOException {File file = new File(fileName);byte[] bytes = loadFile(file);byte[] encoded = Base64.encodeBase64(bytes);String encodedString = new String(encoded);return encodedString;}private static byte[] loadFile(File file) throws IOException {InputStream is = new FileInputStream(file);long length = file.length();if (length > Integer.MAX_VALUE) {// File is too large}byte[] bytes = new byte[(int)length];int offset = 0;int numRead = 0;while (offset < bytes.length&& (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {offset += numRead;}if (offset < bytes.length) {throw new IOException("Could not completely read file "+file.getName());}is.close();return bytes;}return encodeFileToBase64Binary(filename);]]></code>let $path := "http://localhost:8080/mljam/mljam"let $connect := jam:start($path, (), ())let $vars := jam:set("filename", "/some/path/image.png")let $eval := jam:eval-get($code)let $end := jam:end()return $eval
No comments:
Post a Comment