2

HTMLサーバー側を生成し、圧縮し、手動でgzipし、cfcontentとして送り返すColdfusionアプリケーションがあります。

次のようになります。

<cfsavecontent variable="renderedResults">
    <cfoutput><p>Hello World</p></cfoutput>
</cfsavecontent>

<cfscript>
    compressedHTML = reReplace(renderedResults, "\>\s+\<", "> <", "ALL");
    compressedHTML = reReplace(compressedHTML, "\s{2,}", chr(13), "ALL");
    compressedHTML = reReplace(compressedHTML, "\s{2,}", chr(09), "ALL");
</cfscript>

<cfif cgi.HTTP_ACCEPT_ENCODING contains "gzip">
    <cfinvoke component="services.utils" method="gzip" stringToZip="#compressedHTML#" returnvariable="compressedHTML"></cfinvoke>   
    <cfheader name="Content-Encoding" value="gzip">
</cfif>

<cfheader name="Content-Type" value="text/html; charset=ISO-8859-1">
<cfheader name="Content-Length" value="#len(compressedHTML)#" >
<cfcontent reset="no" variable="#compressedHTML#" />
<cfreturn  />

私の GZIP ユーティリティ関数:

<cfscript>
    var result="";
    var text=createObject("java","java.lang.String").init(arguments[1]);
    var dataStream=createObject("java","java.io.ByteArrayOutputStream").init();
    var compressDataStream=createObject("java","java.util.zip.GZIPOutputStream").init(dataStream);
    compressDataStream.write(text.getBytes());
    compressDataStream.finish();
    compressDataStream.close();

    if(arrayLen(arguments) gt 1){
        result=binaryEncode(dataStream.toByteArray(),arguments[2]);
    }else{
        result=dataStream.toByteArray();
    }
    return result;
</cfscript>

私はこれをすべてのページで実行していますが、ページが直接要求されているか、AJAX 経由で要求されているかに関係なく、ほとんどの場合うまく機能します。

ただし、次のエラーが発生することがあります

Diagnose: Attribute validation error for tag cfcontent. java.lang.String is not a supported variable type. The variable is expected to contain binary data. <br>The error occurred on line 338. Browser: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

これがcfcontent線です。

質問:
これは、GZIP をサポートしていないブラウザーまたは GZIP が無効になっているブラウザーによってページが要求された可能性がありますか? その場合、HTML は圧縮されるだけで、バイナリ エンコードされないのでしょうか?

もしそうなら、圧縮されたHTMLをバイナリエンコードする必要があるという修正はありますか?

両方とも間違っている場合、可能であれば光を当ててください。

4

1 に答える 1

1

次のように、 ToBinary()関数を使用して、変数を cfcontent に渡す前にバイナリに変換してみてください...

<cfcontent reset="no" variable="#ToBinary(compressedHTML)#" />
于 2012-10-18T11:42:16.817 に答える