<cfset local.destinationFile = urlEncodedFormat(arguments.destinationFile,'utf-8')>
<cfset local.cs = "PUT\n\n#local.contentType#\n#local.dateTimeString#\nx-amz-acl:#arguments.acl#\nx-amz-storage-class:STANDARD\n/#application.conf.s3.bucket#/#local.destinationFile#">
<cfset local.signature = _createSignature(local.cs)>
<cfhttp method="PUT" url="http://#application.conf.s3.host#/#application.conf.s3.bucket#/#local.destinationFile#" timeout="#arguments.timeout#">
<cfhttpparam type="header" name="Authorization" value="AWS #application.conf.s3.accessKeyId#:#local.signature#">
<cfhttpparam type="header" name="Content-Type" value="#local.contentType#">
<cfhttpparam type="header" name="Date" value="#local.dateTimeString#">
<cfhttpparam type="header" name="x-amz-acl" value="#arguments.acl#">
<cfhttpparam type="header" name="x-amz-storage-class" value="STANDARD">
<cfhttpparam type="body" value="#local.binaryFileData#">
</cfhttp>
<cffunction name="_createSignature" returntype="string" access="public" output="false">
<cfargument name="stringIn" type="string" required="true" />
<cfset var local = structNew()>
<cfset local.fixedData = replace(arguments.stringIn,"\n","#chr(10)#","all")>
<cfset local.digest = _HMAC_SHA1(application.conf.s3.secretKey,local.fixedData)>
<cfset local.signature = toBase64("#local.digest#")>
<cfreturn local.signature>
</cffunction>
<cffunction name="_HMAC_SHA1" returntype="binary" access="private" output="false" hint="NSA SHA-1 Algorithm">
<cfargument name="signKey" type="string" required="true" />
<cfargument name="signMessage" type="string" required="true" />
<cfset var jMsg = JavaCast("string",arguments.signMessage).getBytes("iso-8859-1") />
<cfset var jKey = JavaCast("string",arguments.signKey).getBytes("iso-8859-1") />
<cfset var key = createObject("java","javax.crypto.spec.SecretKeySpec") />
<cfset var mac = createObject("java","javax.crypto.Mac") />
<cfset key = key.init(jKey,"HmacSHA1") />
<cfset mac = mac.getInstance(key.getAlgorithm()) />
<cfset mac.init(key) />
<cfset mac.update(jMsg) />
<cfreturn mac.doFinal() />
</cffunction>