0

这是我第一次编写允许用户下载另一个用户上传的文件的代码。

我编写了一个 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)我希望浏览器默认保存链接,而不是在浏览器窗口中打开链接。

我想要这样做是否合理,还是有更好的下载文件的方法?请告诉我。

4

2 回答 2

2

设置 Content-Disposition HTTP 标头。例如

Content-Disposition: attachment; filename=hello.jpg

你可以在 C# 中使用:

 Response.AddHeader("Content-Disposition", "attachment; filename=hello.jpg");
于 2011-10-04T18:40:11.307 回答
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();
于 2011-10-04T18:43:48.963 回答