2011-10-04 62 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();