带有Railo的Helicon Ape X-Sendfile

时间:2015-01-31 02:18:09

标签: railo ape

我正在尝试将Helicon Ape的mod_xsend文件与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()。如果有人可以帮助我,我将非常感激。

1 个答案:

答案 0 :(得分:0)

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

<FlushThresholdBytes>10240</FlushThresholdBytes>

然而,由于我对Railo的理解有限,似乎将整个文件加载到内存中会对您可以传输的文件大小产生限制。

-John