2009-07-18 9 views
5

Standart HTML <input> çok sayfalı form denetimi verisi kullanarak büyük dosyaları bir ASP.NET sunucusuna yüklüyorum. Bu bir ASP.NET MVC uygulamasıdır. MSDN göreHttpPostedFile neden belleğe değil, diske indirilmiş ve arabelleğe geçirilmiş olarak gerçekleştirmiyor?

, kutudan çıktığı diske HttpPostedFile sınıf tamponlar:

"Dosyalar MIME çok parçalı/form-data formatında yüklenir varsayılan, tüm istekleri dahil formu alanlar tarafından. ve yüklenen dosyalar, 256 KB'dan daha büyük olan disk belleğe tutulur, bunun yerine sunucu belleğinde tutulandan daha çok . "

bu benim denetleyicisi HttpPostedFileBase eriştiklerinde ben HttpPostedFileBase 'ın InputStream özelliğine erişirken, ben, sunucu belleği yetersiz çalıştırma hakkında endişe etmeden bir yere dosya tampon yazabilirsiniz anlamına gelir varsayalım ki açıkçası işe yaramaz bir çözüm.

İşte HttpPostedFileBase gelen dosyaların her biri hallediyorum nasıl pseudocode biraz.

for(var i = 0; i< Request.Files.Count;i++) 
{ 
    var fileBase = Request.Files[i]; 
    if (fileBase.ContentLength == 0) 
    { 
     continue; 
    } 

    // One thread per file 
    ThreadPool.QueueUserWorkItem(state => 
    { 
     // Read from fileBase.InputStream 
    }, 
    null); 
} 

Benim web.config en HttpRuntime blok şuna benzer:

<httpRuntime 
    executionTimeout="1200" 
    requestLengthDiskThreshold="2097151" 
    maxRequestLength="2097151" 
    useFullyQualifiedRedirectUrl="false" 
    minFreeThreads="8" 
    minLocalRequestFreeThreads="4" 
    appRequestQueueLimit="100" /> 

beklendiği gibi My uygulama çalışmaları, birden fazla dosya tüm yükü tampon için gerekli bellek aynı miktarda tüketilen dışında yüklenir sunucu tarafından. InputStream'in her şeyi tamponladığını varsayalım. Hafızamdan daha fazla dosya yüklediğimde, tahminen OutOfMemoryException ile çöküyor. İşte 800mb bir dosya yüklerken bellek başak görüntüsünü.

alt text

Kendimi yüklenenler yakalamak ve onları işlemek için Flash/Silverlight aracını kullanmak veya özel HttpModule yazabilirim biliyorum ama HttpPostedFile MSDN öyle diyor yaptıysam akım gereksinimi kusursuz çalışacak (ya da ben yanlış yapıyorum.

cevap

5

neden konfigürasyonda

requestLengthDiskThreshold="2097151" 

ayarlarım? Bu, sunucuyu diske arabelleğe almak yerine tüm yüklemeleri RAM'de tutmaya zorlamaz mı?

+0

Tabii ki. Yüklemenin başka bir yönünün hatalarını ayıklıyordum ve düşünmeden ayarlamıştım. 256kb'ye ayarlanması, ait olduğu yerde sunucu hafızasını tutar. Teşekkürler! –

+0

@DanielCrenna, bunu 256kb'ye ayarlayarak başarıyla yükleyebilir misiniz? –