GZip строка для вывода из Coldfusion приводит к «ошибке кодирования содержимого» в браузерах - PullRequest
7 голосов
/ 12 сентября 2010

Я пытаюсь GZip содержимое переменной для вывода в браузер. Для начала я делаю это очень просто и не беспокоюсь о браузерах, которые не поддерживают gzip. Также я соединил это из исследования нескольких методов, которые я мог найти в сети. Некоторые из них от людей, которые могут читать этот вопрос.

<cfsavecontent variable="toGZIP"><html><head><title>Test</title></head><body><h1>Fear my test</h1></body></html></cfsavecontent>

<cfscript>
ioOutput = CreateObject("java","java.io.ByteArrayOutputStream");
gzOutput = CreateObject("java","java.util.zip.GZIPOutputStream");

ioOutput.init();
gzOutput.init(ioOutput);

gzOutput.write(toGZIP.getBytes("UTF-8"), 0, Len(toGZIP.getBytes()));

gzOutput.finish();
gzOutput.close();
ioOutput.flush();
ioOutput.close();

toOutput=ioOutput.toString("UTF-8");
</cfscript>

<cfcontent reset="yes" /><cfheader name="Content-Encoding" value="gzip"><cfheader name="Content-Length" value="#ArrayLen( toOuptut.getBytes() )#" ><cfoutput>#toOuptut#</cfoutput><cfabort />

Но я получаю сообщение об ошибке в Firefox (и Chrome и Safari)

Ошибка кодирования содержимого

Невозможно отобразить страницу, которую вы пытаетесь просмотреть, поскольку в ней используется недопустимая или неподдерживаемая форма сжатия.

У кого-нибудь есть идеи?

ОС: Mac OX-X Snow Leopard
CF: 9-Dev
Веб-сервер: Apache


РЕШЕНИЕ

<cfsavecontent variable="toGZIP"><html><head><title>Test</title></head><body><h1>Fear my test</h1></body></html></cfsavecontent>

<cfscript>
ioOutput = CreateObject("java","java.io.ByteArrayOutputStream");
gzOutput = CreateObject("java","java.util.zip.GZIPOutputStream");

ioOutput.init();
gzOutput.init(ioOutput);

gzOutput.write(toGZIP.getBytes(), 0, Len(toGZIP.getBytes()));

gzOutput.finish();
gzOutput.close();
ioOutput.flush();
ioOutput.close();

toOutput=ioOutput.toByteArray();
</cfscript>

<cfheader name="Content-Encoding" value="gzip"><cfheader name="Content-Length" value="#ArrayLen(toOutput)#" ><cfcontent reset="yes" variable="#toOutput#" /><cfabort />

Ответы [ 3 ]

4 голосов
/ 12 сентября 2010

Следующая строка выглядит совершенно неправильно:

toOutput=ioOutput.toString("UTF-8");

Вы кодируете поток GZip с помощью UTF8. Результатом являются мусорные данные. Лучше всего вы устанавливаете данные GZip как двоичные, если ColdFusion имеет опцию Если вы можете установить только строку, то вам нужна кодировка, которая не меняет байтов. Например iso1.

1 голос
/ 12 сентября 2010

Есть ли причина, по которой вы делаете это вручную, позволяя веб-серверу (IIS или Apache) обрабатывать это? Они оба поддерживают кодировку GZip, и , вероятно, сделает это быстрее и лучше, чем ваш ручной процесс.

0 голосов
/ 12 сентября 2010

Обратите внимание, что в коде есть синтаксическая ошибка: toOuptut вместо toOutput.

К сожалению, я не эксперт по Java и не могу сказать, что именно не так.Но когда я пытаюсь сохранить содержимое в файл с помощью wget, он содержит не zip-файл, а исходный HTML.Это может означать, что обработка, связанная с gzOutput, не дает правильного вывода.

Кстати, проверить поддержку GZip в браузере довольно просто.Вы можете проверить заголовок Accept-Encoding, например:

<cfif FindNoCase("gzip", cgi.HTTP_ACCEPT_ENCODING)>
    <!--- prepare the gzipped text --->
</cfif>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...