amazon-web-servicesamazon-s3coldfusionfile-exists

how to check if a file exists on Amazon S3 using Coldfusion fileExist?


I'm running Coldfusion8 and am uploading files to Amazon S3.

When displaying images, I want to check whether an image is available from S3 and if not show a fallback image. My problem is, don't know how to check for existing images.

If I list the link to an image, it's something like this:

http://s3.amazonaws.com/bucket/l_138a.jpg?AWSAccessKeyId=_key_&Expires=_exp_&Signature=_signature_

I'm trying to check for existing files like this:

<cfif fileExists("http://s3.amazonaws.com/bucket/s_" & items.filename)>
    <cfdump output="e:\website\test\dump.txt" label="catch" var="found!!!">
</cfif>

Question:
Do I always have to provide accesskey, expires and signature when checking for an image? If I enter the image path without credentials in the browser, the image is loaded, so I don't understand why my fileExist is not working. Any idea?


Solution

  • I've used the getObjectInfo method in the S3.cfc to see if an object exists:

    <cffunction name="getObjectInfo" access="public" output="false" returntype="string"
                description="Creates a bucket.">
        <cfargument name="bucketName" type="string" required="yes">
        <cfargument name="filekey" type="string" required="true" hint="" />
    
    
        <cfset var data = "">
        <cfset var content = "">
        <cfset var contents = "">
        <cfset var thisContent = "">
        <cfset var allContents = "">
        <cfset var dateTimeString = GetHTTPTimeString(Now())>
    
        <!--- Create a canonical string to send --->
        <cfset var cs = "HEAD\n\n\n#dateTimeString#\n/#arguments.bucketName#/#Arguments.filekey#">
    
        <!--- Create a proper signature --->
        <cfset var signature = createSignature(cs)>
    
        <!--- get the bucket via REST --->
        <cfhttp method="HEAD" url="http://s3.amazonaws.com/#arguments.bucketName#/#Arguments.filekey#">
            <cfhttpparam type="header" name="Date" value="#dateTimeString#">
            <cfhttpparam type="header" name="Authorization" value="AWS #variables.accessKeyId#:#signature#">
        </cfhttp>
    
        <cfreturn cfhttp.StatusCode />
    </cffunction>
    

    If I get a 200 status back, then I know the object exists.