2009-10-21 33 views
6

En az 1GB dosya boyutuna sahip büyük dosyaları yüklemem gerekiyor. benim geliştirme platformu olarak ASP.Net, C# ve IIS 5.1 kullanıyorum.Upload Büyük dosyalar (1GB) -ASP.net

kullanıyorum:

HIF.PostedFile.InputStream.Read(fileBytes,0,HIF.PostedFile.ContentLength) 

kullanmadan önce:

File.WriteAllBytes(filePath, fileByteArray) 

Şu anda ayarlamış (doesnt buraya gitmek ama System.OutOfMemoryException istisna verir) httpRuntime için:

executionTimeout = " "maxRequestLength =" "(2GB şu!) useFullyQualifiedRedirectUrl =" true" MinFreeThreads = "8" minLocalRequestFreeThreads = "4" appRequestQueueLimit = "5000" enableVersionHeader = "true" requestLengthDiskThreshold =" 8192"

Ayrıca ben maxAllowedContentLength="**2097151**" belirledik (tahmin onun sadece IIS7)

Ben de 999.999 saniye için IIS bağlantı zaman aşımı değişti.

ben bellekte her şeyi yüklemeden bile 4578KB (Ajaz-Uploader.zip)

cevap

0

deneyin kopyalama ait dosya yüklemek alamıyorum: büyük dosya yükleme hakkında

public void CopyFile() 
{ 
    Stream source = HIF.PostedFile.InputStream; //your source file 
    Stream destination = File.OpenWrite(filePath); //your destination 
    Copy(source, destination); 
} 

public static long Copy(Stream from, Stream to) 
{ 
    long copiedByteCount = 0; 

    byte[] buffer = new byte[2 << 16]; 
    for (int len; (len = from.Read(buffer, 0, buffer.Length)) > 0;) 
    { 
     to.Write(buffer, 0, len); 
     copiedByteCount += len; 
    } 
    to.Flush(); 

    return copiedByteCount; 
} 
+0

Merhaba manitra, İstemcideki CopyFile() işlevini ve sunucudaki Copy() yöntemini kullanmayı denedim, ancak bazı hatalar aldım. Gözlemlediğim diğer bir şey de, WriteAllBytes'in 3MB veriye kadar çalışacak olmasıdır, "System.Web.Services.Protocols.SoapException: System.Web.Services.Protocols.SoapException: uzantıları çalıştıran bir istisna vardı config dosyasında belirtilen --- System.Web.HttpException: Maksimum istek uzunluğu ..... ..... istisna. –

0

kontrol this blog entry. Ayrıca, bazı tartışma forumlarına, bu konuya da ışık tutabilecek birkaç bağlantıya sahip. Öneri, bu veya özel Flash/Silverlight kontrolü için özel HttpHandler kullanmaktır.

3

Ben googled ve bulunan - NeatUpload


Başka bir çözüm istemci üzerinde bayt okuma ve sunucuya göndermek olacaktır, sunucu dosyasını kaydeder. Örnek

Sunucu: ad alanında - Yükleyici, sınıf - Yükle

[WebMethod] 
public bool Write(String fileName, Byte[] data) 
{ 
    FileStream fs = File.Open(fileName, FileMode.Open); 
    BinaryWriter bw = new BinaryWriter(fs); 
    bw.Write(data); 
    bw.Close(); 

    return true; 
} 

Müşteri:

string filename = "C:\..\file.abc"; 
Uploader.Upload up = new Uploader.Upload(); 
FileStream fs = File.Create(fileName); 
BinaryReader br = new BinaryReader(fs); 

// Read all the bytes 
Byte[] data = br.ReadBytes(); 
up.Write(filename,data); 
+1

Kodu kontrol etmedim. Bunun işe yaradığından emin değilim, sadece fikri iletmek istedim. Bu, neredeyse 20/21 portu yerine, her şey port 80 üzerinden gerçekleştiği için FTP'nin yaptığı şeydir. –

+0

Wow! NeatUpload'dan bahsettiğin için çok memnun oldum. Kendim için bir kopyasını aldım ve projeme eklememi çok kolay bir şekilde yüklemeye başladı. Teşekkürler. –

-1

Sana Response.TransmitFile kullanmak gerektiğini düşünüyorum, bu yöntem web sunucusu belleğinde dosya yüklenmiyor, bu web kullanmadan dosyayı akışları sunucu kaynakları.

if (Controller.ValidateFileExist()) 
     { 
      ClearFields(); 
      Response.Clear(); 
      Response.ContentType = "text/plain"; 
      Response.AddHeader("content-disposition", String.Format("attachment; filename={0}", "FileNAme.Ext")); 
      Response.TransmitFile(FileNAme.Ext); 
      Response.End(); 
      Controller.DeleteFile(); 
     } 
+0

Dosyayı bellekte açmayın, sunucuyu aşağı indireceksiniz! Tüm açılardan, yayınlanan tüm diğer çözümler küçük dosyalarla çalışır, ancak 1Gig dosyalarıyla çalışmaz –

+0

Bu yöntem, büyük dosyaları indirmek veya yüklemek için geriye doğru kullanılabilir, dokümanlar bulabilir miyim? –

5

Bazen 1 ve 2 GB dosyaları yüklemesi gereken bir uygulamaya sahibiz. Çok fazla araştırmadan sonra, sonuçta daha önce bahsedilen NeatUpload'u veya bunun gibi bir şeyi uygulamaya koymamız gerektiğidir.

<httpRuntime maxRequestLength=.../> 

kilobayt ölçülür iken

Ayrıca,

<requestLimits maxAllowedContentLength=.../> 

bayt ölçülür unutmayın. Yani değerler daha aşağıdaki gibi görünmelidir: maxRequestLength Ayar

<httpRuntime maxRequestLength="2097151"/> 
... 
<requestLimits maxAllowedContentLength="2097151000"/> 
0

HTTP isteği boyutu için varsayılan sınırı 4mb, daha büyük dosya yükleme için yeterli olmalı. Lütfen yapılandırma dosyanızın hiçbir şeyin geçersiz kılınmayacağından emin olun.

Alternatif olarak, dosyaları 2mb parçalarına yükleyen ve ASP.NET istek boyutu sınırlamasını etkin bir şekilde atlayabilen async upload provided by Telerik'u da kontrol edebilirsiniz.

1

Bunun eski bir soru olduğunu biliyorum, ama yine de cevapsız. Sen yorumunda bakın

<security> 
    <requestFiltering> 

     <!-- 3GB Files/in byte (3072*1024*1024) --> 
     <requestLimits maxAllowedContentLength="3221225472" /> 

    </requestFiltering> 
</security> 

altında

<!-- 3GB Files/in kilobyte (3072*1024) --> 
    <httpRuntime targetFramework="4.5" maxRequestLength="3145728"/> 

ve bu:

Web.config dosyasında

, bu ekleyin:

Yani bu yapmanız gereken budur Bu nasıl çalışır. Birinde baytı baytta, diğerinde kilobaytta almalısınız. Umarım yardımcı olur.

İlgili konular