Helicon Ape X-Sendfile с Railo

Я пытаюсь использовать mod_xsendfile Helicon Ape с сервером Railo (Windows 2012 R2). Модуль mod_xsendfile работает правильно, и он отлично работает с PHP, он доставляет файл, а также передает значение длины содержимого в браузер. В PHP не обнаружено ограничений по размеру файла и не требуется значительного использования памяти независимо от размера файла.

С Railo очевидна первая попытка.

<cfcontent type="text/plain">
<cfheader name="content-disposition" value="attachment; filename=test.txt"/>
<cfheader name="X-Sendfile" value="D:\iis\hello.txt"/>

Это не работает. Возвращает пустой файл; Helicon Ape не генерирует журнал ошибок, поэтому можно с уверенностью предположить, что X-Sendfile заголовка не был правильно передан в IIS.

Вторая попытка

<cfheader name="content-disposition" value="attachment; filename=test.txt"/>
<cfset Response = GetPageContext().GetResponse() />
<cfset Response.setHeader('X-Sendfile','D:\iis\hello.txt')>
<cfset Response.setContentType('plain/text')>
<cfset Response.GetOutputStream().Flush() />
<cfset Response.Reset() />
<cfset Response.Finish() />

Это работает с

Ограничение 1: Когда размер файла превышает 2 ГБ, браузер возвращает ошибку "ERR_INVALID_CHUNKED_ENCODING". Он отлично работает с меньшим размером файла, без проблем с памятью. (опять же, PHP, похоже, не имеет этой проблемы. IIS также не имеют ограничения по размеру)

Ограничение 2: Это не передает длину содержимого в браузер, следовательно, браузер не знает размер файла.

Третья попытка: добавить длину содержимого вручную. (это не обязательно с PHP)

<cfset filePath = "D:\iis\246.zip">
<cfheader name="content-disposition" value="attachment; filename=246.zip"/>
<cfset Response = GetPageContext().GetResponse() />
<cfset Response.setContentLength( createObject("java","java.io.File").init( filePath ).length() )>
<cfset Response.setHeader('X-Sendfile', filePath )>
<cfset Response.setContentType('application/octet-stream')>
<cfset Response.GetOutputStream().Flush() />
<cfset Response.Reset() />
<cfset Response.Finish() />

Длина содержимого передается в браузер, но, в отличие от PHP, IIS пытается выделить память для файла, и вскоре это приводит к ошибке "Переполнение или недополнение в арифметической операции".

Я уверен, что я не обрабатываю GetPageContext().GetResponse() правильно. Если кто-то может помочь мне здесь, я был бы очень признателен.

1 ответ

Если вы используете BonCode для подключения к IIS, у него есть средства для спулинга больших файлов без перегрузки лимита памяти сервера. Таким образом, позволяя эффективную потоковую передачу. Вам нужно будет добавить настройку FlushThresholdBytes в настройку BonCode (проверьте c:\windows), например:

<FlushThresholdBytes>10240</FlushThresholdBytes>

Тем не менее, из моего ограниченного понимания Railo кажется, что весь файл загружается в память, что создает ограничение на размер файла, который вы можете передавать.

-John

Другие вопросы по тегам