通用处理程序文件下载无法启动

时间:2015-04-28 21:10:39

标签: c# httpcontext ashx generic-handler

我正在尝试从服务器开始下载文件,现在只是存在一些硬编码的文件值,但由于某种原因,下载没有启动,也没有引发错误。

这是我的代码:

public void ProcessRequest(HttpContext context)
{
    string destPath = context.Server.MapPath("~/Attachments/cover.txt");
    // Check to see if file exist
    FileInfo fi = new FileInfo(destPath);

    if (fi.Exists)
    {
        HttpContext.Current.Response.ClearHeaders();
        HttpContext.Current.Response.ClearContent();
        HttpContext.Current.Response.AppendHeader("Content-Length", fi.Length.ToString());
        HttpContext.Current.Response.ContentType = "application/octet-stream";
        HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment; filename=" + "cover.txt");
        HttpContext.Current.Response.BinaryWrite(ReadByteArryFromFile(destPath));
        HttpContext.Current.Response.End();
    }
}

public bool IsReusable
{
    get
    {
        return false;
    }
}

private byte[] ReadByteArryFromFile(string destPath)
{
    byte[] buff = null;
    FileStream fs = new FileStream(destPath, FileMode.Open, FileAccess.Read);
    BinaryReader br = new BinaryReader(fs);
    long numBytes = new FileInfo(destPath).Length;
    buff = br.ReadBytes((int)numBytes);
    return buff;
}

我正在踩代码并且没有问题,但浏览器中也没有显示文件下载弹出窗口。

你知道有什么不对吗?

提前致谢,Laziale

2 个答案:

答案 0 :(得分:1)

我相信您遇到的问题是您的来电HttpContext.Current。由于您使用通用处理程序文件,我相信您希望利用传递给方法签名的context参数。一个例子是:

public void ProcessRequest (HttpContext context)
{
     // Build Document and Zip:
     BuildAndZipDocument(); 

     // Context:
     context.Response.ContentType = "application/zip";
     context.Response.AddHeader("content-disposition", "filename="Commodity.zip");
     zip.Save(context.Response.OutputStream);

     // Close:
     context.Response.End();
}

我相信如果您使用context,而不是HttpContext.Current,它将解决您的问题。

答案 1 :(得分:0)

永远不要在ZIP文件的Content-Type标头中使用“application / zip”。决不! IE6中确认的错误会破坏下载。

如果您想要在过去和现在的大多数浏览器中使用二进制文件的最通用行为总是使用“application / octet-stream”就像您在其他地方使用它一样!!

header('Content-Type:application / octet-stream');

这可以克服IE6错误,假设您关心。尽管如此,通过从application / octet-stream切换到application / zip,你没有任何成就,所以你不妨在那个上浪费你的时间并保持application / octet-stream。