2016-08-24 2 views
1

私は以下のスクリプトを使用しています。これは、ローカル(Windows 10 IIS、Windows 2003 Server)では正常に動作しますが、当社のホストサーバー(Windows 2003 Server)では動作しません。 4MB以上のファイルは、ファイルの最後に到達する前に実際には遅くなり、その後タイムアウトになるでしょう。ただし、ローカルでは、高速で完全なダウンロードが行われます。ASPクラシック、特定のサーバーで大きなファイルをダウンロードできない

ダイレクトダウンロード(ファイルへのリンク)を行うと、当社のホスティングプロバイダサーバから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

を使用しています。私はデフォルト設定が4MBだと信じています... – sgeddes

+0

上記のとおりです。あなたはファイルを直接ダウンロードすることができ、大きなファイルをまったくダウンロードしません。ちょうどスクリプトではありません。 –

+0

それはページ内のすべてのコードですか、それともスニペットですか?おそらく減速の原因になるかもしれませんか?チャンクサイズを大きくするのはどうですか?例として、1つのチャンク*(2048バイト)*を読むには100ミリ秒かかります。つまり、4 MBファイルのダウンロードには約3分かかりますが、チャンクサイズを20480 *(20 KB)約。 20秒、違いを参照してください? – Lankymart

答えて

3

:ここでは、コードの私のバージョンがあります。

しかし、それはおそらく、ファイルのサイズに関連して読み込まれているチャンクのサイズです。

我々は4メガバイトのファイル(4194304バイト)のあなたの例を使用し、それがその後、各チャンクを読み取るために100ミリ秒かかると言うならば、非常に大まか式は、したがって、このような何か...

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

です以下が適用される。 2048バイト(2 KB)

  • チャンクサイズは約になります。読むのに3分。

  • チャンクサイズ20480バイト(20 KB)は、読むには20秒。上記

クラシックASPのIIS 7上のページとはそう常にスクリプトは終えることができました前にタイムアウトとなる2キロバイトのチャンクで100ミリ秒で読ま4メガバイトのファイル上記の例では、デフォルトに00:01:30scriptTimeoutを持っています。

これはちょうどおおまかな統計で、読み取り時間は常に同じではなく、おそらく100ミリ秒より速いでしょう。(ディスクの読み取り速度によって異なります)しかし、私はあなたがポイントを得ると思います。

だから、CHUNKを増やしてみてください。

Const CHUNK = 20480 'Read in chunks of 20 KB 
+0

あなたは揺れます。 最後に0を加えて、ジョブを実行しました。 私はちょうどそれをホスティングサーバー上でテストし、ダイレクトダウンロードの時間の2分の1で26mbのファイルをダウンロードし、それを完了しました。約26秒で約10秒。 直接ダウンロードは約5秒です。 別の0(204800)を追加しても問題ありませんか? –

+0

@WayneBarronその試行錯誤のビットは、個人的にはバイト増分で設定しましたので、2 KB、20 KBを試したので、次に200 KB *(204800バイト)*を試してみました。あなたがスループットに満足するまで、増加を続けてください。読み取られるチャンクが大きくなればなるほど、より多くのリソースが必要になるため、リソース使用量とパフォーマンスの間のトレードオフになります。 – Lankymart

+0

私はこれを2048000に設定しました。これは、約1.5MBの秒のダウンロード速度を引き出しています。それで、それはそれをかなりうまく処理するはずです。ランキットマートに感謝、良いものをお持ちください。 –

0

私が持っているコードは、Do..Untilループの代わりにFor..Nextループを使用して少し異なります。これは実際にあなたのケースでは動作しますが、試してみる価値は100%ではありません。ただ、それは大丈夫に見えるコードスニペットを見て、私は(特にResponse.IsClientConnectedの使用のような)大きなファイルをダウンロードするために使用する非常にアプローチです

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 
+0

私は過去にこのタイプのチャンクダウンロードを行うためにDo Whileを使用しました。 – Lankymart

+1

個人的には好きですが、 'Do'ループはより洗練されたアプローチであり、余分なビットを読み取って、' Response.BinaryWrite() 'のコードの重複を避けています。 – Lankymart

+0

私の場合は、上記のLankymartの受け入れられた答えに指摘されているように、チャンクのサイズが読み込まれていることが原因でした。 –

0

基本的にスクリプトのタイムアウトが原因です。 IIS 10でWin 2016にアップグレードした後も、同じ問題がIIS 10で発生しました(デフォルトのタイムアウトはデフォルトでは短くなりました)。

私はおそらくIIS構成の問題256000とServer.ScriptTimeoutの塊= 60 0 '10分

関連する問題