Continuing on Mashup Guide :: listing keys with S3Ajax, here I present a Chickenfoot script to create a bucket and upload a file (specifically, it creates a bucket by the name of raymondyeetest
and uploads a file (D:\Document\PersonalInfoRemixBook\examples\ch16\Exported Items.rdf
from my WinXP machine) to the key exportitems.rdf
in the bucket:
include("D:\\document\\JavaScriptLib\\sha1.js"); include("D:\\document\\JavaScriptLib\\S3Ajax.js"); var AWSAccessKeyId = "[AWSAccessKeyId]"; var AWSSecretAccessKey = "[AWSSecretAccessKey]"; S3Ajax.URL = 'http://s3.amazonaws.com'; S3Ajax.DEBUG = true; S3Ajax.KEY_ID = AWSAccessKeyId; S3Ajax.SECRET_KEY = AWSSecretAccessKey; // function to read contents from a file function read_file_contents(aFileURL) { // https://developer.mozilla.org/en/Code_snippets/File_I%2f%2fO#Binary_File var ios = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); var url = ios.newURI(aFileURL, null, null); if (!url || !url.schemeIs("file")) throw "Expected a file URL."; var bFile = url.QueryInterface(Components.interfaces.nsIFileURL).file; var istream = Components.classes["@mozilla.org/network/file-input-stream;1"] .createInstance(Components.interfaces.nsIFileInputStream); istream.init(bFile, -1, -1, false); var bstream = Components.classes["@mozilla.org/binaryinputstream;1"] .createInstance(Components.interfaces.nsIBinaryInputStream); bstream.setInputStream(istream); var bytes = bstream.readBytes(bstream.available()); return bytes; } // create a bucket var newBucketName = 'raymondyeetest'; S3Ajax.createBucket(newBucketName, function() { output("created a buicket: " + newBucketName); s3_list(); }, function () { output ("error in createBucket"); } ); // add a key to a bucket var fileURL = 'file:///D:/Document/PersonalInfoRemixBook/examples/ch16/Exported%20Items.rdf' var content = read_file_contents(fileURL); alert(content); S3Ajax.put(newBucketName , "exportitems.rdf", content, { content_type: "application/xml; charset=UTF-8", meta: {'creator':'Raymond Yee'}, acl: "public-read", }, function(req) { output("Upload succeeded"); }, function(req, obj) { output("Upload failed"); } );
A few things to note about this code:
-
read_file_contents()
doesn't strike me as a terribly elegant way of reading contents from a file — but that's what I have working for now - a tricky part of getting this to work was to note that in FF 3.x, charset=UTF-8 is automatically tacked on to content-type HTTP request header in a xmlhttprequest — I don't know how to change the charset or whether you can — and why UTF-8 is being tacked on. But figuring out the charset was crucial to getting this working since the content-type HTTP header is used in the calculation of the Amazon S3 signature.
Post a Comment