首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在S3上创建CFDirectory?

在S3上创建CFDirectory?
EN

Stack Overflow用户
提问于 2017-03-10 02:10:04
回答 2查看 440关注 0票数 1

工作在一个简单的上传器,要求我上传到‘用户特定的’文件夹,这将需要创建的第一次用户上传的东西。所有存储都在S3上完成。我目前拥有的测试代码是这样的(mybucket.domain.name不是真正的存储桶,显然--在这篇文章中改变了这一点);

代码语言:javascript
复制
<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>

当我运行此命令时,不会返回任何错误-但它总是报告目录不存在,并且从未真正创建过它。我已经搜索了这里的文档和以前的帖子,据我所知,语法是正确的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-10 02:48:52

这里的主要问题是S3并不认为任何东西都是“文件夹”。S3中没有目录树--都是对象,其中一些对象的名称中恰好有/字符。

有几种方法可以解决这个问题,但这两种方法都不能让您使用directoryExists()。

第一种方法是评估directoryList('s3://mybucket/foldername')返回的数组是否包含任何成员。

另一种方法是通过cfc执行所有的S3操作。这里有一个:https://github.com/joedanz/cf-amazon-s3

如果你开发了自己的组件来扩展这个组件,你可以添加我写的这个函数来完成同样的事情:

代码语言:javascript
复制
<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”应为"/“。)

*另一个编辑--您可能也需要此函数:

代码语言:javascript
复制
<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客户端通过创建长度为零的对象并将其解释为文件夹来绕过文件夹的不存在。

票数 2
EN

Stack Overflow用户

发布于 2019-12-06 13:46:58

如果您想要从ColdFusion在亚马逊网络服务S3上创建一个“文件夹”,您必须创建一个0长度的文件,并在其名称的末尾加上一个"/“。

我使用内置支持的方法很简单:

代码语言:javascript
复制
 <cffile action = "write"
file = "s3://yourS3bucket/folder_1/" output="">

在将其写入您的存储桶后,AWS会将其报告为目录,DirectoryExists将使用它(返回true),或者如果您将存储桶作为查询DirectoryList,则此对象的类型为DIR。您也可以通过DirectoryCopy访问它(尽管“递归”并不能对源目录中的任何子目录真正起到预期的作用)。注意:现在,您的存储桶中将有一个对象,其关键字为"folder_1/“

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42702513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档