2016-08-24 4 views
1

로컬로 (Windows 10 IIS, Windows 2003 Server) 제대로 작동하지만 Google 호스팅 서버 (Windows 2003 Server)에서는 작동하지 않는 다음 스크립트를 가지고 있습니다. 4MB를 초과하는 파일은 파일의 끝에 도달하기 전에 정말로 느린 속도로 다운로드 한 후 시간 초과됩니다. 그러나 로컬에서는 빠르게 다운로드됩니다.ASP Classic, 큰 파일 다운로드가 특정 서버에서 작동하지 않습니다.

직접 다운로드 (파일 자체 링크)를 수행하면 호스팅 제공 업체 서버에서 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

아마 IIS 구성 문제를 사용합니다. 나는 기본 설정이 4MB라고 믿는다 ... – sgeddes

+0

위에서 말했듯이.파일을 직접 다운로드 할 수 있으며, 큰 파일을 전혀 다운로드하지 않습니다. 그냥 대본을 쓰지 마라. –

+0

페이지의 코드가 전부입니까, 아니면 스 니펫입니까? 아마도 천천히 일으키는 원인이 될 수 있습니까? 또는 청크 크기를 늘리는 것은 어떻습니까? 예를 들어 하나의 청크 (* 2048 바이트) *를 읽는 데 100 밀리 초가 걸린다는 것은 4MB 파일을 다운로드하는 데 약 3 분이 걸리지 만 20480 * (20KB) *라고 말하는 청크 크기를 늘리면 * 약. 20 초, 그 차이를 보시겠습니까? – Lankymart

답변

3

: 여기에 코드를 내 버전입니다.

그러나 그 말은, 파일 크기와 관련하여 청크의 크기가 읽힐 가능성이 높습니다.

매우 거의 공식은 다음과 같이 ... 그래서

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

우리가 4 메가 ​​바이트 파일의 당신의 예를 (4,194,304 바이트)를 사용하고 다음 각 청크를 읽을 수 100 밀리 초 소요 말하면이다 다음이 적용된다. 2048 바이트 (2 KB)

  • 덩어리의 크기는 약 걸릴 것입니다. 읽을 시간은 3 분.

  • 덩어리 크기 20480 바이트 (20KB) 읽을 20 초. 위의

클래식 ASP의 IIS 7 페이지와 그래서 지속적으로 스크립트 완료 전에 타임 아웃 것이다 2킬로바이트 청크에서 100 밀리 초에서 읽을 4 메가 ​​바이트 파일 위의 예에서 기본을 00:01:30scriptTimeout 있습니다.

이것들은 단지 거친 통계 일뿐입니다. 읽기 시간은 계속 동일하게 유지되지 않으며 그럴 가능성이 더 깁니다. (디스크 읽기 속도에 따라 다름)하지만 나는 그 점을 이해한다고 생각합니다.

따라서 CHUNK을 늘려보십시오.

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

락. 끝 부분에 0을 추가하여 작업을 수행했습니다. 난 그냥 호스팅 서버에서 그것을 테스트하고 직접 다운로드 시간의 2 분의 1에 26mb 파일을 다운로드하고 그것을 완료했습니다. 26MB에 대해 약 10 초. 직접 다운로드는 약 5 초입니다. 또 다른 0 (204800)을 추가하는 것이 좋습니다. 그렇지 않다고 생각하십니까? –

+0

@WayneBarron 그것의 약간의 시행 착오가 필요하다. 개인적으로 바이트 증분으로 설정 했으므로 2KB, 20KB를 시도 했으므로 다음으로 200KB * (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에서 1GB 파일과 동일한 문제가있었습니다.

나는 256000 및 Server.ScriptTimeout의 덩어리 = 60 0 '10 분

관련 문제