0

我正在运行Coldfusion8并将文件上传到 Amazon S3。

显示图像时,我想检查 S3 中是否有图像可用,如果没有则显示后备图像。我的问题是,不知道如何检查现有图像。

如果我列出图像的链接,它是这样的:

http://s3.amazonaws.com/bucket/l_138a.jpg?AWSAccessKeyId=_key_&Expires=_exp_&Signature=_signature_

我正在尝试检查这样的现有文件:

<cfif fileExists("http://s3.amazonaws.com/bucket/s_" & items.filename)>
    <cfdump output="e:\website\test\dump.txt" label="catch" var="found!!!">
</cfif>

问题:检查图像时
我是否总是必须提供?accesskey, expires and signature如果我在浏览器中输入没有凭据的图像路径,则会加载图像,所以我不明白为什么我fileExist的不起作用。任何的想法?

4

4 回答 4

4

如果您设置了站点范围的页面未找到消息,则可以使用 cfhttp。

<cfhttp url="http://a.espncdn.com/photo/2012/0813/nfl_u_flynn1x_203.jpg" method="head">
<cfdump var="#cfhttp.filecontent#">

返回 java.io.ByteArrayOutputStream 的对象

<cfhttp url="http://a.espncdn.com/photo/20notanimage3.jpg" method="head">
<cfdump var="#cfhttp.filecontent#">

返回<html> <body> <h1>Error Processing Request</h1> </body> </html>

也可以查看服务器返回的状态码

<cfhttp url="http://a.file.exists.gif" method="head">
<cfdump var="#val(cfhttp.statuscode)#">

200没问题,404没找到,等等

于 2012-08-14T01:10:09.290 回答
2

我已经很长时间没有使用 Coldfusion,但是我快速查找了一下,fileExists 方法似乎是用于文件系统查找,而不是远程 URL。

还有其他用于请求 URL 的 Coldfusion 方法。我很快发现的一个关于这个主题的论坛讨论在这里:http ://forums.adobe.com/thread/765614

但是,假设您正在生成供 Web 浏览器使用的 HTML,我建议您在 HTML/CSS/JS 而不是服务器端进行图像检查/回退。您可以使用 CSS 背景图像技巧来做到这一点,或者直接使用 JS 加载和检查图像。我发现处理这个问题的一个问题是here(关于这个东西可能有一堆类似的问题):Inputing a default image in case the src attribute of an html <img> is not valid?

于 2012-08-13T23:15:02.217 回答
2

我已经使用getObjectInfoS3.cfc 中的方法来查看对象是否存在:

<cffunction name="getObjectInfo" access="public" output="false" returntype="string"
            description="Creates a bucket.">
    <cfargument name="bucketName" type="string" required="yes">
    <cfargument name="filekey" type="string" required="true" hint="" />


    <cfset var data = "">
    <cfset var content = "">
    <cfset var contents = "">
    <cfset var thisContent = "">
    <cfset var allContents = "">
    <cfset var dateTimeString = GetHTTPTimeString(Now())>

    <!--- Create a canonical string to send --->
    <cfset var cs = "HEAD\n\n\n#dateTimeString#\n/#arguments.bucketName#/#Arguments.filekey#">

    <!--- Create a proper signature --->
    <cfset var signature = createSignature(cs)>

    <!--- get the bucket via REST --->
    <cfhttp method="HEAD" url="http://s3.amazonaws.com/#arguments.bucketName#/#Arguments.filekey#">
        <cfhttpparam type="header" name="Date" value="#dateTimeString#">
        <cfhttpparam type="header" name="Authorization" value="AWS #variables.accessKeyId#:#signature#">
    </cfhttp>

    <cfreturn cfhttp.StatusCode />
</cffunction>

如果我得到一个200状态,那么我知道该对象存在。

于 2012-08-14T12:10:44.310 回答
1

CF9 +

<cfscript>
    FileExists('s3://#accessKey#:#secretKey#@[your bucket]/[your file]');
</cfscript>
于 2016-06-30T04:33:13.030 回答