私はColdfusion8
リモートサーバーから画像を取得する必要があります。これは次のように実行しています。
<cfhttp timeout="45" throwonerror="no" url="#variables.testFilePath#" method="get" useragent="Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12" getasbinary="yes" result="variables.objGet">
<cfset variables.objImage = ImageNew(variables.objGet.FileContent)>
画像をAmazonS3に保存する必要がありますが、使用したい関数は次のとおりです。
<cfset result = s3.putObject(url.b,file.serverFile,file.contentType,'300',form.cacheControl,'30',form.acl,form.storageClass,form.keyName,GetTempDirectory())>
生成された画像を見つけることができるディレクトリが必要です。
質問:
画像ファイルのディレクトリを取得して、cfhttp
を使用して画像に変換する方法はありimageNew
ますか?または、最初にファイルをディスクに保存する必要がありますか?また、保存する前にサイズを変更する必要があるため、最初にディスクに保存しないとうまくいかない場合があります。
ポインタをありがとう!
編集:
私はそれをこのように機能させました:
<!--- getAsBinary --->
<cfhttp timeout="45"
throwonerror="no"
url="#variables.testFilePath#"
method="get"
useragent="..."
getasbinary="yes"
result="objGet">
<!--- validate --->
<cfif len(variables.testFilePath) EQ 0>
<cfset variables.errorCount = variables.errorCount+1>
<cfset variables.failedLoads = "FILE NOT FOUND" >
<cfelse>
<cfif len(objGet.Filecontent) EQ 0>
<cfset variables.errorCount = variables.errorCount+1>
<cfset variables.failedLoads = "COULD NOT LOAD IMAGE">
<cfelseif NOT listfindnocase(variables.allow, variables.fileExt) >
<cfset variables.errorCount = variables.errorCount+1>
<cfset variables.failedLoads = "WRONG FILE TYPE">
<cfelse>
<cftry>
<cfscript>
objImage = ImageNew(objGet.FileContent);
ImageSetAntialiasing(objImage,"on");
<!--- resize/crop --->
variables.keyName = Session.loginid & "_S_";
</cfscript>
<!--- convert modified image back to binary --->
<cfset variables.filekey = toBase64( objImage )>
<!--- pass to s3.cfc --->
<cfset result = s3.putObject(variables.bucketName, variables.filekey, variables.contentType, variables.httptimeout, variables.cacheControl, variables.cacheDays, variables.acl, variables.storageClass, variables.keyName, variables.imageSrc, "true" )>
<cfcatch>
<cfset variables.errorCount = variables.errorCount+1>
<cfset variables.failedLoads = "NO IMAGE">
</cfcatch>
</cftry>
</cfif>
トリミングされた画像をバイナリに再変換する必要がありs3.putobject
ます。そうしないと、別cffile action="readBinary"
の処理が行われ、ここで画像ファイルのパス(画像はまだ一時的です)を作成しようとして中断するためです。
<cffile action="readBinary" file="#arguments.uploadDir##arguments.fileKey#" variable="binaryFileData">
このトリックを使用して一時ファイルのパスを取得し、設定uploadDir
しても効果はありません。CFのドキュメントによると、パスはドライブ文字またはスラッシュで始まる絶対パスである必要があります。そうでない場合は、www-roottempディレクトリが使用されます。
C:/
私の場合、一時ファイルCFFile-ServletがオンE:/
で、相対パスも機能しなかった(ファイルが見つかりません)ときに、一時www-rootディレクトリがオンになりました。s3.cfcから画像を再読み込みする方法が見つからなかったため、S3.cfcを呼び出す前にバイナリに変換し直しています。別のパラメーター(1/0)を渡して、s3.cfcに、既にバイナリイメージを送信しているので、再度読み取る必要がないことを通知します。
そのようです:
<!--- if encoded is true, filekey already is the encoded image --->
<cfif arguments.encoded EQ "true">
<!--- already sending binary image --->
<cfset binaryFileData = arguments.fileKey>
<cfelse>
<!--- Default --->
<cffile action="readBinary" file="#arguments.uploadDir##arguments.fileKey#" variable="binaryFileData">
</cfif>
これがパフォーマンスの面で最も賢い方法かどうかはわかりませんが、かなりスムーズに機能しているようです。コメントは大歓迎です!