This is a follow-up to my earlier post with the addition of WORKING CODE and an ONLINE DEMO. Before you go all demo happy, you need to have your own credentials to either a local OpenStack Swift (object storage) system or RackSpace CloudFiles.
The demo is written entirely using client side JavaScript. That is really important because it allows you to test Swift WITHOUT A WEB SERVER. All the other Swift/Rackspace libraries (there are several) are intended for your server application to connect and then pass the file back to the client. In addition, the API uses meta tags that are not settable from the browser so you can’t just browse into your Swift repos.
Here’s what the demo does:
- Login to your CloudFiles site – returns the URL & Token for further requests.
- Get a list of your containers
- See the files in each container (click on the container)
- Retrieve the file (click on the file) to see a preview if it is an image file
The purpose of this demo is to be functional, not esthetic. Little hacks like pumping the config JSON data to the bottom of the page are helpful for debugging and make the action more obvious. Comments and suggestions are welcome.
The demo code is 4 files:
- demo.html has all the component UI and javascript to update the UI
- demo.js has the Swift interfacing code (I’ll show a snippet below) to interact with Swift in a generic way
- demo.css is my lame attempt to make the page readable
- jQuery.js is some first class code that I’m using to make my code shorter and more functional.
1-17 update: in testing, we are working out differences with Swift and RackSpace. Please expect updates.
HACK NOTE: This code does something unusual and interesting. It uses the JavaScript XmlHttpRequest object to retrieve and render a BINARY IMAGE file. Doing this required pulling together information from several sources. I have not seen anyone pull together a document for the whole process onto a single page! The key to making this work is overrideMimeType (line G), truncating the 32 bit string to 16 bit ints ( & 0xFF in encode routine), using Base64 encoding (line 8 and encode routine), and then “src=’data:image/jpg;base64,[DATA GOES HERE]'” in the tag (see demo.html file).
Here’s a snippet of the core JavaScript code (full code) to interact with Swift. Fundamentally, the API is very simple: inject the token into the meta data (line E-F), request the /container/file that you want (line D), wait for the results (line H & 2). I made it a little more complex because the same function does EITHER binary or JSON returns. Enjoy!
retrieve : function(config, path, status, binary, results) { 1 xmlhttp = new XMLHttpRequest(); 2 xmlhttp.onreadystatechange=function() //callback 3 { 4 if (xmlhttp.readyState==4 && xmlhttp.status==200) { 5 var out = xmlhttp.responseText; 6 var type = xmlhttp.getResponseHeader("content-type"); 7 if (binary) 8 results(Swift.encode(out), type); 9 else A results(JSON.parse(out)); B } C } D xmlhttp.open('GET',config.site+'/'+path+'?format=json', true) E xmlhttp.setRequestHeader('Host', config.host); F xmlhttp.setRequestHeader('X-Auth-Token', config.token); G if (binary) xmlhttp.overrideMimeType('text/plain; charset=x-user-defined'); H xmlhttp.send(); }
I tested on my localhost and it dosen’t work and don’t now what’s wrong, when I use the swift utility or the curl utility it works fine but with your code I get nothing I try to debugg it but I couldn’t figure out the problem any suggestion I know it’s diffiucult to know but any sugestions from your experience
LikeLike
Thanks for your question. This script only works on Mac OSX Safari. It will fail if you are using it from Windows or Firefox. It has to do with the way these browsers handle meta tags. Since I was trying to make a general purpose validation page, these limitations are why I stopped development.
I hope this helps.
LikeLike