工作在一个简单的上传器,要求我上传到‘用户特定的’文件夹,这将需要创建的第一次用户上传的东西。所有存储都在S3上完成。我目前拥有的测试代码是这样的(mybucket.domain.name不是真正的存储桶,显然--在这篇文章中改变了这一点);
<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>当我运行此命令时,不会返回任何错误-但它总是报告目录不存在,并且从未真正创建过它。我已经搜索了这里的文档和以前的帖子,据我所知,语法是正确的。
发布于 2017-03-10 02:48:52
这里的主要问题是S3并不认为任何东西都是“文件夹”。S3中没有目录树--都是对象,其中一些对象的名称中恰好有/字符。
有几种方法可以解决这个问题,但这两种方法都不能让您使用directoryExists()。
第一种方法是评估directoryList('s3://mybucket/foldername')返回的数组是否包含任何成员。
另一种方法是通过cfc执行所有的S3操作。这里有一个:https://github.com/joedanz/cf-amazon-s3
如果你开发了自己的组件来扩展这个组件,你可以添加我写的这个函数来完成同样的事情:
<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>(如果要在存储桶的根目录中查找“文件夹”,则“folderPath”应为"/“。)
*另一个编辑--您可能也需要此函数:
<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客户端通过创建长度为零的对象并将其解释为文件夹来绕过文件夹的不存在。
发布于 2019-12-06 13:46:58
如果您想要从ColdFusion在亚马逊网络服务S3上创建一个“文件夹”,您必须创建一个0长度的文件,并在其名称的末尾加上一个"/“。
我使用内置支持的方法很简单:
<cffile action = "write"
file = "s3://yourS3bucket/folder_1/" output="">在将其写入您的存储桶后,AWS会将其报告为目录,DirectoryExists将使用它(返回true),或者如果您将存储桶作为查询DirectoryList,则此对象的类型为DIR。您也可以通过DirectoryCopy访问它(尽管“递归”并不能对源目录中的任何子目录真正起到预期的作用)。注意:现在,您的存储桶中将有一个对象,其关键字为"folder_1/“
https://stackoverflow.com/questions/42702513
复制相似问题