2010-01-21 25 views
8

Ben WriteFile kullanarak bu dosyayı geçir sunucuda bir 5Mb pdf bana transmitfile doğru 5Mb dosya boyutu verir gibi bir 15Mb indir, ...Response.TransmitFile dosya boyutu vs C# Response.WriteFile sorunları

mi verir var Bu, writeFile için sunucudaki belleğe bir çeşit sıkıştırılmadan kaynaklanıyor mu? Herkes oluyor aynı şeyi görmüştü eğer sadece

if (File.Exists(filepath)) 
{ 
    HttpContext.Current.Response.Clear(); 
    HttpContext.Current.Response.ContentType = "application/octet-stream"; 
    HttpContext.Current.Response.AddHeader("content-disposition","attachment;filename=\""+Path.GetFileName(filepath)+"\""); 
    HttpContext.Current.Response.AddHeader("content-length", new FileInfo(filepath).Length.ToString()); 

    //HttpContext.Current.Response.WriteFile(filepath); 
    HttpContext.Current.Response.TransmitFile(filepath); 

    HttpContext.Current.Response.Flush(); 
    HttpContext.Current.Response.Close(); 
} 
+0

Ben de aynı hatayı yaşadım. IIS'deki sıkıştırma ayarları bunu etkilemez. – geofftnz

cevap

7

TransmitFile ... olmanın

kodu

(biz ?? iis7 gittiğinden beri PS sadece fark) ... acaba - yazar belirtilen dosyayı doğrudan belleğe almadan bir HTTP yanıt çıkışı akışına yönlendirir.

WriteFile - Belirtilen dosyayı doğrudan bir HTTP yanıt çıkış akışına yazar.

İletim dosyasının arabelleğe alınmaması nedeniyle farkın meydana geldiğini söyleyebilirim. Yazma dosyası temel olarak geçici olarak verileri iletmeden önce arabelleğe almayı (Afiak) kullanıyor, çünkü doğru dosya boyutunu tahmin edemediği için parçalara yazıyor.

2

Tanımı izleyerek anlayabilirsiniz.

Response.TransmitFile VS Response.WriteFile:

  • TransmitFile: Bu yöntem sunucudaki uygulama hafızasına yüklemeden istemciye dosyayı gönderir. İndirilen dosya boyutu büyükse, onu kullanmak için ideal yoldur.

  • WriteFile: Bu yöntem, sunucuya yüklenen dosyayı istemciye göndermeden önce yükler. dosya boyutu büyükse, sen ASP.NET alt işlemi için yeniden almak olabilir belki *

Referans: -. TransmitFile VS WriteFile