2

有一个桌面浏览器叫做“ 360安全浏览器”。他们在中国占有相当大的市场份额,我们需要支持他们。

它说布局引擎是 Trident (IE),这是我所期望的,但我现在无法验证(在 Mac 上!)。

这样做的原因是我有一些表单可以启动下载,将字节流式传输到客户端,并且它们可以在其他主要浏览器中使用。导致问题的代码如下或类似。这是在做我没有注意到的错误吗?字节流通常在 50-100KB 左右,我们还没有遇到过问题。

  • 调用此代码以响应 PostBack 事件(例如,在网格中单击按钮等)
  • 使用来自文件、在内存中生成或从 db 读取的字节流调用此函数。

功能:

public static bool DownloadStream(byte[] packageStream, string fileName) {
    var response = HttpContext.Current.Response;
    response.Clear();
    response.AddHeader("Accept-Ranges", "bytes");
    response.AddHeader("Content-Disposition", "inline; filename=" + HttpUtility.UrlEncode(fileName, Encoding.UTF8));
    response.AddHeader("Content-Length", packageStream.Length.ToString());
    response.ContentType = "application/xlsx";
    response.BinaryWrite(packageStream);
    response.Flush();
    HttpContext.Current.ApplicationInstance.CompleteRequest();
    return true;
}

有没有人有支持这个浏览器的经验?在谷歌上用英文搜索时,我找不到任何关于它的信息。没有规格,没有文档,什么都没有。我得去百度找资料,看不懂那种程度的中文!

编辑:

问题显然在于 360 使用的下载器。不过,我想知道流代码中是否应该更改某些内容。我缺少的标题或其他内容。

  • 这只发生在文件上。相同的页面,更大的下载 = 没有问题。
  • 更改为内置 IE 下载器会导致问题消失。
4

1 回答 1

2

您好,我在 360 安全浏览器上尝试了您的代码。它对我有用。我在下面编辑一点是我的代码。注意:据我所知,360 安全浏览器使用的是 IE Core。

   protected void Page_Load(object sender, EventArgs e)
    {
        DownloadStream(StreamFile(@"C:\Users\My\Desktop\test2.xlsx"), "test.xlsx");
    }

    private byte[] StreamFile(string filename)
    {
        FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);

        // Create a byte array of file stream length
        byte[] Data = new byte[fs.Length];

        //Read block of bytes from stream into the byte array
        fs.Read(Data, 0, System.Convert.ToInt32(fs.Length));

        //Close the File Stream
        fs.Close();
        return Data; //return the byte data
    }


    public static bool DownloadStream(byte[] packageStream, string fileName)
    {
        var response = HttpContext.Current.Response;
        response.ClearContent();
        response.ClearHeaders();
        response.AppendHeader("Accept-Ranges", "bytes");
        response.AppendHeader("Content-Disposition", "inline; filename=" + HttpUtility.UrlEncode(fileName, Encoding.UTF8));
        response.AppendHeader("Content-Length", packageStream.Length.ToString());
        response.ContentType = "application/xlsx";
        response.BinaryWrite(packageStream);
        response.Flush();
        response.End();
        return true;
    }
于 2012-04-06T08:55:39.733 回答