使用Leigh版本的S3Wrapper.cfc,无法通过初始化。

7
我是一名新手,需要使用S3进行图像存储。我找到了半打s2wrapper for cf的版本,但似乎唯一一个针对v4设置的版本是由Leigh修改的。
您可以在以下链接中找到该版本:https://gist.github.com/Leigh-/26993ed79c956c9309a9dfe40f1fce29 将其放置在com目录中,并创建一个包含以下代码的“test”页面:
s3 = createObject('component','com.S3Wrapper').init(application.s3.AccessKeyId,application.s3.SecretAccessKey);

但是收到了以下错误消息: enter image description here 所以我把第37行从:

variables.Sv4Util = createObject('component', 'Sv4').init(arguments.S3AccessKey, arguments.S3SecretAccessKey);

更改为

variables.Sv4Util = createObject('component', 'Sv4Util').init(arguments.S3AccessKey, arguments.S3SecretAccessKey);

现在我得到以下结果:enter image description here 我觉得直接修改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>

无论我在bucket、obj或region中输入什么,我都会得到以下错误信息:enter image description here JIC,我已经去AWS获取了新的密钥:enter image description here Leigh如果你还在这里,或者任何使用过s3Wrappers的人有什么建议或指导?
更新#2: 即使Alex提供帮助后,我仍然无法使其正常工作。从getObjectLink收到的链接无效,而getObject从未下载过对象。我想尝试putObject方法。
test3 = s3.putObject(bucketName=bucket,regionName=region,keyName="favicon.ico");
writeDump(test3);

为了查看是否有其他信息,我收到了这个:enter image description here 我找到了这篇文章https://shlomoswidler.com/2009/08/amazon-s3-gotcha-using-virtual-host.html,但它已经很老了,因为S3特别建议在桶名称中使用点,所以我认为它不再相关。显然我做错了什么,但我已经花了数小时来解决这个问题,但似乎找不出问题出在哪里。

1
我的命名不好(为了区分签名4版本)。它需要两个组件:S3包装器和Sv4实用程序。A)将S3组件保存为S3v4.cfc,B)签名4实用程序保存为Sv4.cfc(都在您的“com”目录中)。然后在第38行将“com”添加到CFC路径中:variables.Sv4Util = createObject('component', 'com.Sv4').init(...); - Leigh
继续...谢谢提醒!明天我会修复问题(以便更清晰明了)。 - Leigh
问题到底是什么?你对哪些函数调用有什么期望结果? - Alex
我期望从第一次调用中获得对象本身(d/l),从第二次调用中获取链接或获取某种类型的错误,但我没有得到任何一个。 - Lance
在花费了太多时间之后,我已经能够使用 Lucee 中所有内置的 S3 服务来完成我需要做的事情。 - Lance
1个回答

1
我将为您解释代码的作用: getObjectLink 返回一个HTTP链接,该链接指向位于区域 s3-us-west-1 的存储桶 imgbkt.domain.com 中的文件 fake.ping。这个链接是临时的,默认情况下在60秒后过期。 getObject 调用 getObjectLink 并立即使用 HTTP GET 请求该链接。然后将响应保存到 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会将整个文件读入缓冲区。使用fileOpen来流式传输内容。

这对你有帮助吗?


我已经在我的原始问题中添加了“更新#2”。我仍然认为我做错了什么,在尝试putObject后,我得到了更多的信息来支持这一点。 - Lance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接