ここでの主な問題は、S3が何かを「フォルダ」とはみなさないということです。 S3にはディレクトリツリーはありません。それはすべて単なるオブジェクトであり、そのオブジェクトの中には名前に/文字が含まれているものがあります。
これにはいくつかの方法がありますが、どちらもdirectoryExists()を使用することはできません。
最初の方法は、directoryList( 's3:// mybucket/foldername')によって返された配列にメンバーが含まれているかどうかを評価することです。
もう1つの方法は、すべてのS3操作をcfcで行うことです。ここでは一つだ: https://github.com/joedanz/cf-amazon-s3
あなたが1つを拡張する独自のコンポーネントを作る場合、あなたはそれに私が同じことを達成するために書いたこの機能を追加することができます(「FOLDERPATHは」/」となり
<cffunction name="folderExists" access="public" returntype="boolean" hint="folderPath = path/to/folder/ (with trailing slash and no leading slash)">
<cfargument name="folderPath" type="string" />
<cfset var objArr = getBucket(bucketName=variables.bucket,prefix='#arguments.folderPath#',delimiter='/') />
<cfloop array="#objArr#" index="local.o">
<cfif o.key EQ arguments.folderPath AND o.size EQ 0>
<cfreturn true />
</cfif>
</cfloop>
<cfreturn false />
</cffunction>
を"あなたが探している場合は、『バケツのルートで』フォルダ)
*別の編集を - あなたは、この機能が必要になる場合があります、あまりにも:。
<cffunction name="folderCreate" access="public" returntype="void">
<cfargument name="folderPath" type="string" default="" />
<cfargument name="bucket" type="string" default="#variables.bucket#" />
<cfif len(folderPath)>
<cfif right(folderPath,1) NEQ "/">
<cfset folderPath &= "/" />
</cfif>
<cfset putObject(bucketName=bucket,uri=variables.finderPath&URLEncodedFormat(folderPath),contentType='binary/octet-stream') />
</cfif>
</cffunction>
説明:私が見たほとんどのS3クライアントは、長さゼロのオブジェクトを作成し、それらをフォルダとして解釈することによって、フォルダの存在を回避します。
質問とは関係ありません。実際にコードがcfif条件内で何かを実行しない限り、それを省略して単純に ' do something ' –
Leigh
を使用するときれいになります。 – Lee