2011-10-04 60 views
0

這是我第一次編寫代碼,允許用戶下載其他用戶上傳的文件。如何指定用戶通過ASHX下載器下載的文件的名稱?

我已經寫了一個ASHX文件,download.ashx,其代碼如下所示:

s = context.Request.QueryString.ToString(); 
byte[] buffer = new ReplacementTicketFileIO().GetSpecifiedFile(s); 
context.Response.BinaryWrite(buffer); 
context.Response.Flush(); 
context.Response.End(); 

當鏈路用戶點擊與適當的查詢字符串download.ashx,文件下載,但瀏覽器想要在瀏覽器窗口中顯示內容。如果用戶右鍵單擊該鏈接,他可以下載該文件,但該文件的名稱默認爲download.ashx。

我想完成兩兩件事:

1)我想是能夠指定下載基於查詢字符串在用戶的設備上的文件的默認名稱。例如,如果用戶點擊download.ashx?linkedfile = car.pdf,我希望瀏覽器默認爲car.pdf作爲此文件的名稱。

2)我希望瀏覽器默認保存鏈接,而不是在瀏覽器窗口中打開鏈接。

我想要這樣做還是有更好的方式來下載文件是合理的嗎?請告訴我。

回答

2

設置Content-Disposition HTTP標頭。例如。

Content-Disposition: attachment; filename=hello.jpg 

你可以做,在C#中使用:

Response.AddHeader("Content-Disposition", "attachment; filename=hello.jpg"); 
+0

+1:非常感謝! –

0

下面是我對Excel文件,我相信它會強制下載,而不是一個新的窗口。 QueryString有一個頁面屬性。您只需要捕獲QueryString並在此代碼中使用它以及確定內容類型。 String.Format會給你乾淨的代碼。

private string _ExcelFilename 
{ 
     get 
{ 
    return (Request.QueryString["xls"] != null) ? Request.QueryString"xls"] : "bis"; 
} 
} 

Page.Response.Clear(); 
Page.EnableViewState = false; 
Page.Response.Clear(); 
Page.Response.ContentType = "application/vnd.ms-excel"; 
Page.Response.AppendHeader("Content-Disposition", String.Format("attachment; filename={0}_{1}.xls", _ExcelFilename, DateTime.Now.ToString("yyyyMMdd"))); 
Page.Response.Write(excel); 
Page.Response.Flush(); 
Page.Response.End();