Bir projemde şöyle bir senaryo ile karşılaştım.
Kullanıcı kendisi ile ilgili açılan bir bölüme, başkasının görmemesi gereken dosyaları upload etmesi gerekiyordu.
Aynı şekilde site yöneticisi de bu kişi adına oraya dosya atabilmeliydi. Ancak dediğim gibi bu dosyanın başkası tarafından görülmemesi çok önemliydi.
Response.redirect'le veya bir link vererek bu işi yapamazdım, çünkü browser'ın history'sinde kaldığı için aynı makinaya oturan bir başkası o linki tıkladığında dosyayı indirebilirdi.
İnternette bulduğum şu yöntem çok hoşuma gitti:
public class FileManager
{
public static void DownloadFile(int FileId)
{
MyClass.Entity.File f = (MyClass.Entity.File)Facade.Dosya.GetById(FileId).File; //Burası önemsiz, dosya bilgileri
//f.Name'de dosyanın GUID isimle kaydedilmiş hali var, OriginalName özelliğinde ise dosyanın orjinal adı var (a.jpg gibi)
System.IO.FileStream fs= System.IO.File.Open(System.Web.HttpContext.Current.Server.MapPath(@"~/Files/"+f.Name),System.IO.FileMode.Open);
byte[] bytes = new byte[fs.Length];
fs.Read(bytes, 0, (int)fs.Length);
fs.Close();
System.Web.HttpContext.Current.Response.AddHeader("Content-disposition","attachment; filename="+f.OriginalName );
System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";
System.Web.HttpContext.Current.Response.BinaryWrite(bytes);
System.Web.HttpContext.Current.Response.End();
}
}