2017-03-09 14 views
1

ユーザーが何かを初めてアップロードするときに作成する必要のある、「ユーザー固有の」フォルダにアップロードする簡単なアップローダを操作します。すべてのストレージはS3上で実行されます。私が現時点で持っているテストコードはこれです(mybucket.domain.nameは実際のバケツではありません。明らかにこのポスティングのために変更されています)。CFDirectory S3で作成しますか?

<cfif DirectoryExists("s3://mybucket.domain.name/test123/")> 
    <!--- The directory exists ---> 
<cfelse> 
    <!--- Directory doesn't exist, so create it ---> 
    <cfdirectory action="CREATE" directory="s3://mybucket.domain.name/test123/" storelocation="US"> 
</cfif> 

これを実行するとエラーは返されませんが、ディレクトリは存在しないと常にレポートされ、実際には作成されません。私はここでドキュメントと以前の投稿を精査しており、構文が正しいことを伝えることができます。

+0

質問とは関係ありません。実際にコードがcfif条件内で何かを実行しない限り、それを省略して単純に ' do something' – Leigh

+1

を使用するときれいになります。 – Lee

答えて

2

ここでの主な問題は、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クライアントは、長さゼロのオブジェクトを作成し、それらをフォルダとして解釈することによって、フォルダの存在を回避します。

+0

奇妙なことに、私が以前に何か変わっていない限り、S3で使用されるDirectoryExistsの数多くの例がそこにあります - レイモンド・カムデンの記事がGoogleのトップ結果の1つです)。それが存在するかどうかを検出することができると仮定すると、おそらく '作成'はまだ機能しているはずですか? – Lee

+0

私が見たRayの同じブログ記事を参照しているなら、彼はバケット内のオブジェクトではなく、バケットに対してdirectoryExists()を使用していることに気づくでしょう。 DirectoryCreate()は同じ理由でDirectoryExists()と同じ問題を抱えます。これは、最初はバケツと呼ばれています。なぜなら、それはオブジェクトをダンプする単なるバケットだからです。 –

+0

ああ - あなたが知っている、私は完全にそれを逃した!ヘッドアップありがとう、私は明らかにいくつかのコーヒーが必要です! – Lee

関連する問題