1

私は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>

これがパフォーマンスの面で最も賢い方法かどうかはわかりませんが、かなりスムーズに機能しているようです。コメントは大歓迎です!

4

3 に答える 3

2

の代わりに属性を使用できるpathと思います。+を使用して一時パスを生成し、フェッチしてからドロップします。さらに、コンテンツを変数にフェッチしてから中間ファイルに書き込むよりも、メモリ効率が少し高くなる可能性があります。fileresultGetTempDirectory()CreateUUID()

于 2012-08-10T17:59:59.947 に答える
1

Cfhttpの結果は、データをメモリ変数に格納します。ImageNewは、「ColdFusion」イメージを作成します。これは、イメージがメモリ内にのみ存在することを意味します。cfhttpまたはimagewriteなどで送信する物理ファイルにするために保存する必要があります。

物理ファイルに保存せずに、cffile action = "writetobrowser"を使用してブラウザーに送信する必要がありますが、ブラウザーがアクセスできるように一時的な場所に保存することになりますが、ここではあまり役に立ちません。考える。

http://livedocs.adobe.com/coldfusion/8/htmldocs/functions_h-im_34.html http://livedocs.adobe.com/coldfusion/8/htmldocs/Images_19.html

于 2012-08-10T18:06:32.050 に答える
0

AmazonS3ClientにはInputStreamを受け取るputObjectメソッドがあるため、バイナリデータをByteArrayInputStreamでラップし、バッキングファイルを気にせずに渡すことができます。

このようなもの:

<cfhttp method="get" url="#local.url#" result="local.httpResult" getAsBinary="true"/>
<cfif local.httpResult.statusCode eq "200 OK">
    <cfset var fileInputStream = createObject("java", "java.io.ByteArrayInputStream" ).init(local.httpResult.fileContent) />
    <cfset var objectMetadata = createObject("java", "com.amazonaws.services.s3.model.ObjectMetadata" ).init() />
    <cfset application.S3UTIL.s3Client.putObject("some.bucket", "folder/file.ext", local.fileInputStream, local.objectMetadata)/>
</cfif>
于 2015-12-16T17:43:36.303 に答える