我是S3的新手,需要将其用于图像存储。我找到了cf的s2wrapper的六个版本,但看来v4的唯一一组是Leigh修改的
https://gist.github.com/Leigh-/26993ed79c956c9309a9dfe40f1fce29
放入com目录,并创建一个包含以下代码的“测试”页面:
s3 = createObject('component','com.S3Wrapper').init(application.s3.AccessKeyId,application.s3.SecretAccessKey);
但出现以下错误:
所以我改变了第37行
variables.Sv4Util = createObject('component', 'Sv4').init(arguments.S3AccessKey, arguments.S3SecretAccessKey);
至
variables.Sv4Util = createObject('component', 'Sv4Util').init(arguments.S3AccessKey, arguments.S3SecretAccessKey);
现在我得到:
我觉得遍历Leigh代码并开始更改东西是一个坏主意,因为我已经潜伏在这里一年了,因为Leigh的代码很扎实。
是否知道在任何地方如何使用此功能的示例?如果不是,那我做错了。如果有所作为,我使用的是Lucee 5,而不是Adobe的CF引擎。
更新:
我遵循了Leigh的指示,错误现在消失了。我在测试页面上添加了更多代码,现在看起来像这样:
<cfscript>
s3 = createObject('component','com.S3v4').init(application.s3.AccessKeyId,application.s3.SecretAccessKey);
bucket = "imgbkt.domain.com";
obj = "fake.ping";
region = "s3-us-west-1"
test = s3.getObject(bucket,obj,region);
writeDump(test);
test2 = s3.getObjectLink(bucket,obj,region);
writeDump(test2);
writeDump(s3);
</cfscript>
无论我为存储区,obj或区域输入什么内容,我都会得到:
JIC我确实去过AWS并获得了新密钥:
如果您仍然在身边,或者有人对s3Wrappers之一的使用方式有何建议或指导,请多指教?
更新2:
即使在Alex的帮助下,我也无法使它正常工作。我从getObjectLink收到的链接无效,并且getObject从不下载对象。我以为我会尝试putObject方法
test3 = s3.putObject(bucketName=bucket,regionName=region,keyName="favicon.ico");
writeDump(test3);
查看是否还有其他信息,我收到了此信息:
我确实找到了https://shlomoswidler.com/2009/08/amazon-s3-gotcha-using-virtual-host.html这个文章,但是它已经很老了,并且由于S3特别建议在存储桶名称中使用点,所以我不再认为它有意义。显然我在做错事,但是我花了数小时试图解决这个问题,但我似乎无法弄清楚这可能是什么。
最佳答案
我将简要介绍代码的作用:getObjectLink
返回文件fake.ping
的HTTP URL,该文件在区域imgbkt.domain.com
的存储桶s3-us-west-1
中查找。此链接是临时的,默认情况下在60秒后过期。getObject
调用getObjectLink
并立即使用HTTP GET请求URL。然后,默认情况下,响应将以文件名S3v4.cfc
保存到fake.ping
的目录中。最后,该函数返回下载文件的完整路径:E:\wwwDevRoot\taa\fake.ping
要将文件保存在其他位置,请调用:
downloadPath = 'E:\';
test = s3.getObject(bucket,obj,region,downloadPath);
writeDump(test);
HTTP请求是同步的,这意味着当函数返回文件路径时,将完全下载文件。
如果要访问文件的实际内容,可以执行以下操作:
test = s3.getObject(bucket,obj,region);
contentAsString = fileRead(test); // returns the file content as string
// or
contentAsBinary = fileReadBinary(test); // returns the content as binary (byte array)
writeDump(contentAsString);
writeDump(contentAsBinary);
(如果文件很大,您可能想流式传输内容,因为
fileRead
/fileReadBinary
将整个文件读入缓冲区。Use fileOpen
to stream the content.这对您有帮助吗?