我正在运行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
无效。有什么想法吗?
答案 0 :(得分: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,等等
答案 1 :(得分:2)
我很长时间没有使用过Coldfusion,但我进行了快速查找,而且fileExists方法似乎用于文件系统查找,而不是远程URL。
还有其他Coldfusion方法可用于请求URL。我刚刚发现的关于这个主题的一个论坛讨论在这里:http://forums.adobe.com/thread/765614
但是,假设您正在生成HTML以供Web浏览器使用,我建议您在HTML / CSS / JS而不是服务器端进行图像检查/回退。您可以使用CSS background-image技巧完成此操作,或使用JS直接加载和检查图像。我发现的一个问题就是在这里(这个问题可能有很多类似的问题):Inputting a default image in case the src attribute of an html <img> is not valid?
答案 2 :(得分:2)
我在S3.cfc中使用了getObjectInfo
方法来查看对象是否存在:
<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
状态,那么我知道该对象存在。
答案 3 :(得分:1)
CF9 +
<cfscript>
FileExists('s3://#accessKey#:#secretKey#@[your bucket]/[your file]');
</cfscript>