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 の方法は他にもあります。私がすぐに見つけたテーマに関するフォーラムの議論の 1 つがここにあります: http://forums.adobe.com/thread/765614

ただし、Web ブラウザーで使用する HTML を生成していると仮定すると、サーバー側ではなく、HTML/CSS/JS で画像チェック/フォールバックを行うことをお勧めします。CSS の背景画像のトリックを使用してこれを行うか、JS を使用して画像を直接読み込んで確認することができます。私が見つけたこれを扱う1つの質問はここにあります(おそらく、このようなものについては同様の質問がたくさんあります):HTML <img> の src 属性が無効な場合に備えて、デフォルトの画像を入力していますか?

于 2012-08-13T23:15:02.217 に答える
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、オブジェクトが存在することがわかります。

于 2012-08-14T12:10:44.310 に答える
1

CF9+

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