ASP Classic,下载大文件在某些​​服务器上不起作用

时间:2016-08-24 19:03:14

标签: asp-classic

我有以下脚本,它在本地运行良好(Windows 10 IIS,Windows 2003 Server),但不在我们的托管服务器(Windows 2003 Server)上。任何超过4mb的内容都会下载非常慢,然后超时才会到达文件末尾。但是,在本地,它下载速度快且完整。

执行直接下载(链接到文件本身)在5秒内从我们的托管服务提供商服务器下载26.5mb文件。因此,下载限制没有问题。托管服务器和此脚本似乎存在问题。有什么想法吗?

Response.AddHeader "content-disposition","filename=" & strfileName
Response.ContentType = "application/x-zip-compressed" 'here your content -type

Dim strFilePath, lSize, lBlocks
'Const CHUNK = 2048
' Thanks to Lankymart. I have set this and it download at 1.5MB a second, so that is running pretty well for what I need it to be.
Const CHUNK = 2048000
set objStream = CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = 1
objStream.LoadFromfile Server.MapPath("up/"&strfileName&"") 
lSize = objStream.Size
Response.AddHeader "Content-Size", lSize
lBlocks = 1
Response.Buffer = False
Do Until objStream.EOS Or Not Response.IsClientConnected
Response.BinaryWrite(objStream.Read(CHUNK))
Loop

objStream.Close

3 个答案:

答案 0 :(得分:4)

只是查看代码片段,它看起来很好,是我用来下载大文件的方法(特别是使用Response.IsClientConnected

但是,尽管如此,可能会根据文件大小读取块的大小。

非常粗略的公式是这样的......

time to read = ((file size / chunk size) * read time) 

因此,如果我们使用您的4 MB文件(4194304字节)的示例并说它需要100毫秒来读取每个块,则以下情况适用;

  • 2048字节的块大小(2 KB)大约需要。 3分钟阅读。

  • 块大小为20480字节(20 KB)大约需要。 20秒阅读。

IIS 7及更高版本上的经典ASP页面的默认scriptTimeout00:01:30所以在上面的示例中,在脚本完成之前,在2 KB块中以100毫秒不断读取的4 MB文件将超时

现在这些只是粗略的统计数据,您的阅读时间不会保持不变,而且可能会快100毫秒(取决于磁盘读取速度)但我认为您明白了。

所以只需尝试增加CHUNK

Const CHUNK = 20480 'Read in chunks of 20 KB

答案 1 :(得分:0)

我的代码有点不同,使用For..Next循环而不是Do..Until循环。不是100%肯定这将真正适用于您的情况,但值得一试。这是我的代码版本:

For i = 1 To iSz / chunkSize
    If Not Response.IsClientConnected Then Exit For
    Response.BinaryWrite objStream.Read(chunkSize)
Next 
If iSz Mod chunkSize > 0 Then 
    If Response.IsClientConnected Then 
        Response.BinaryWrite objStream.Read(iSz Mod chunkSize)
    End If 
End If

答案 2 :(得分:0)

基本上是由于脚本超时。使用IIS 10升级到Win 2016后,IIS 10中的1GB文件出现了同样的问题(默认情况下默认超时较短)。

我使用块256000 Server.ScriptTimeout = 60 0'10分钟