Thursday, October 8, 2009

Upload to S3 with Groovy

So, uploading to S3 is not always as simple as it should be. Here's a completely self-contained Groovy script that can upload files to your S3 bucket, plus provide a signed link to access the uploaded file.

The script uses Groovy Grab macro to download the JetS3t library which does the heavy lifting.

#!/opt/groovy/bin/groovy
/* Script to manipulate S3 objects.  
 * @author Tom Nichols
 * @see http://blog.thomnichols.org
 * @see http://jets3t.s3.amazonaws.com/api/org/jets3t/service/impl/rest/httpclient/RestS3Service.html
 */

import org.jets3t.service.impl.rest.httpclient.RestS3Service
import org.jets3t.service.security.AWSCredentials
import org.jets3t.service.model.*

bucketName =       'CHANGEME'
accessKey =        'CHANGEME'
secretKey =        'CHANGEME'
folder =           'CHANGEME' // optional folder name before the file

@Grab(group='net.java.dev.jets3t',module='jets3t',version='[0.6.1,)')
public putS3() {}

def login = new AWSCredentials( accessKey, secretKey )
def expiry = new GregorianCalendar( 2011,0,1 ).time
def s3 = new RestS3Service( login ) 
def bucket = new S3Bucket( bucketName )

args.each { fileName ->
  def key = "$folder/$fileName"
//  s3.deleteObject bucketName, key 
  def s3obj = new S3Object( bucket, new File( fileName ) )
  s3obj.key = key 
  println "\nUploading $fileName to $bucketName/$key"
  s3obj = s3.putObject( bucket, s3obj )
  
  def link = s3.createSignedGetUrl( bucketName, key, login, expiry, false )
  println "$fileName : $link"
} 
Just change the bucket name, key and folder at the top of the script, or optionally you could pull them in via system properties or environment variables. Enjoy.

No comments:

Post a Comment