0

我正在尝试将 Helicon Ape 的 mod_xsendfile 与 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 没有生成错误日志,因此可以安全地假设 Header 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:当文件大小超过 2GB 时,浏览器返回错误“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()。如果有人可以在这里帮助我,我将不胜感激。

4

1 回答 1

0

如果您使用 BonCode 连接到 IIS,它可以在不超载服务器内存限制的情况下假脱机大文件。因此,允许有效的流式传输。您需要将 FlushThresholdBytes 设置添加到您的 BonCode 设置中(检查 c:\windows),例如:

<FlushThresholdBytes>10240</FlushThresholdBytes>

但是,根据我对 Railo 的有限理解,它似乎将整个文件加载到内存中,这会限制您可以流式传输的文件大小。

-约翰

于 2015-02-19T22:18:45.570 回答