使用以下代码我无法显示打开/另存为文件对话框:
public void ProcessRequest(HttpContext context)
{
string link = context.Request.QueryString["Link"];
string extension = Path.GetExtension(link);
string fileName = Path.GetFileName(link);
string fullPath =
String.Format("{0}\\{1}",
context.Server.MapPath("~/Content/Uploads/"),
fileName);
if (File.Exists(fullPath))
{
context.Response.ClearContent();
context.Response.ClearHeaders();
context.Response.AddHeader(
"Content-Length",
new FileInfo(fullPath).Length.ToString());
string contentType;
switch (extension)
{
default:
contentType = "application/octet-stream";
break;
}
context.Response.ContentType = contentType;
context.Response.AddHeader(
"Content-Disposition",
String.Format("attachment; filename={0}", fileName));
context.Response.WriteFile(fullPath, true);
context.Response.Flush();
}
}
我尝试关闭响应,保持响应打开,使用TrasmitFile()
,但我从未得到任何对话或任何反馈。我也试过调试它,但没有抛出异常。在IE 7/8和Chrome中尝试过。任何帮助表示赞赏。
谢谢!
以下是Fiddler输出:
HTTP / 1.1 200 OK Cache-Control:私有 内容长度:3813内容类型: application / octet-stream服务器: Microsoft-IIS / 7.5内容处理: 附件; 文件名= b1af9b34-28cc-4479-a056-8c55b41a5ece.txt X-AspNet-Version:4.0.30319 X-Powered-By:ASP.NET日期:星期四,23 2010年12月21:51:58 GMT
* Home * Hotels * Reviews * Community * Travel Guide * Travel Insurance * Contact us
* FIDDLER:RawDisplay被截断为128个字符。右键单击以禁用 截断。 *
答案 0 :(得分:2)
尝试更改
contentType = "application/octet-stream";
到
contentType = "application/download";
<强>更新强>: 尝试交换标题和内容类型的位置
context.Response.AddHeader(
"Content-Disposition",
String.Format("attachment; filename={0}", fileName));
context.Response.ContentType = contentType;
context.Response.AddHeader(
"Content-Length",
new FileInfo(fullPath).Length.ToString());
答案 1 :(得分:2)
终于明白了。我发布的代码实际上没有问题。正如您在Fiddler输出中看到的那样,文本文件的内容已成功写入响应流,并且使用的标头也是正确的。实际问题来自实际的http请求是如何产生的。我用过
$得到(urlToGenericHandler);
使用jQuery请求。特别是我无法使用AJAX或回调模型下载文件的原因超出了本答案的范围。请参阅支持的jQuery数据类型here
无论如何,我将使用AJAX的呼叫更改为使用基本的回复。
感谢所有帮助。