我有以下脚本,它在本地运行良好(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
答案 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页面的默认scriptTimeout
为00: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分钟