我是S3的新手,需要将其用于图像存储。我找到了cf的s2wrapper的六个版本,但看来v4的唯一一组是Leigh修改的

https://gist.github.com/Leigh-/26993ed79c956c9309a9dfe40f1fce29

放入com目录,并创建一个包含以下代码的“测试”页面:

s3 = createObject('component','com.S3Wrapper').init(application.s3.AccessKeyId,application.s3.SecretAccessKey);

但出现以下错误:
amazon-s3 - 使用Leigh版本的S3Wrapper.cfc无法通过Init-LMLPHP

所以我改变了第37行
variables.Sv4Util = createObject('component', 'Sv4').init(arguments.S3AccessKey, arguments.S3SecretAccessKey);

variables.Sv4Util = createObject('component', 'Sv4Util').init(arguments.S3AccessKey, arguments.S3SecretAccessKey);
现在我得到:amazon-s3 - 使用Leigh版本的S3Wrapper.cfc无法通过Init-LMLPHP

我觉得遍历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或区域输入什么内容,我都会得到:amazon-s3 - 使用Leigh版本的S3Wrapper.cfc无法通过Init-LMLPHP

JIC我确实去过AWS并获得了新密钥:amazon-s3 - 使用Leigh版本的S3Wrapper.cfc无法通过Init-LMLPHP

如果您仍然在身边,或者有人对s3Wrappers之一的使用方式有何建议或指导,请多指教?

更新2:
即使在Alex的帮助下,我也无法使它正常工作。我从getObjectLink收到的链接无效,并且getObject从不下载对象。我以为我会尝试putObject方法
test3 = s3.putObject(bucketName=bucket,regionName=region,keyName="favicon.ico");
writeDump(test3);

查看是否还有其他信息,我收到了此信息:amazon-s3 - 使用Leigh版本的S3Wrapper.cfc无法通过Init-LMLPHP

我确实找到了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.

这对您有帮助吗?

08-26 16:02