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ü.
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.
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! –
@DanielCrenna, bunu 256kb'ye ayarlayarak başarıyla yükleyebilir misiniz? –