流式HTML文件在IE中没有Open选项

时间:2013-12-11 13:22:25

标签: asp.net internet-explorer filestream

我们的ASP.NET Web应用程序中有一些文件浏览器。

它可以将驻留在外部的各种类型的文件流向用户。 现在一切都运行正常,但现在他们想要流式传输HTML文件并提出问题。

当我想在IE中流式传输HTML文件时,下载提示符不会给我打开它的选项,它只有“保存并另存为”选项。

我一直在谷歌搜索数天,但我唯一能找到的是如何关闭“打开”按钮,但我希​​望它在那里,而不是默认情况下。 Firefox和Chrome在下载提示中都有一个Open选项。

外部服务器上用于流式传输文件的代码如下:

注意:file是我们自己的文件对象的一个​​实例,它包含信息,如路径,文件名,标志,...关于我们要传输的文件

        System.IO.FileInfo fileInfo = new System.IO.FileInfo("C:\\\\MyFolder\\" + file.FullName);
        if (fileInfo.Exists)
        {
            System.IO.FileStream fs = new System.IO.FileStream("C:\\\\MyFolder\\" + file.FullName, System.IO.FileMode.Open, System.IO.FileAccess.Read);

            string filename = file.Name.Replace(" ", "_");

            page.Trace.IsEnabled = false;                
            page.Response.Expires = 0;
            page.Response.Buffer = true;
            page.Response.Clear();
            page.Response.ContentType = MimeTypeParser.GetMimeType(fileInfo.FullName); //Gets the Correct content type: "text/html" in this case
            page.Response.AddHeader("Content-Length", fs.Length.ToString());
            page.Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
            int bufferSize = 8192;
            // default to 4K, may want to use 8K instead           
            byte[] bytes = null;
            bytes = new byte[bufferSize + 1];
            int read = 0;

            //Helper to read the bytes to the response steamer
            while ((InlineAssignHelper(read, fs.Read(bytes, 0, bytes.Length))) != 0)
            {
                page.Response.OutputStream.Write(bytes, 0, read);
            }
            page.Response.OutputStream.Flush();
            //close off response or else you get corrupted files
            fs.Close();
            page.Response.End();
        }
        else
        {
            page.Response.StatusCode = 404;
            page.Response.End();
        }

在应用程序本身上,以下代码用于从流转化器获取数据并将其推送到对客户端的响应:

public void StreamFile(int id, System.Web.HttpRequest clientRequest, System.Web.HttpResponse clientResponse)
        {
            try
            {
                OurDomain.File file = OurBLL.FileService.GetFile(id);
                if (file != null)
                {
                    string url = "http://FilestreamingServer?StreamFile.aspxid=" + file.Pkey + "&userName=" + userName;
                    Uri uri = new Uri(url);
                    System.Net.WebRequest request = System.Net.HttpWebRequest.Create(uri);

                    request.Method = System.Net.WebRequestMethods.Http.Get;
                    System.Net.WebResponse response = request.GetResponse();// 1st code block on the other server is invoked here

                    clientResponse.ContentType = response.Headers["Content-Type"];
                    clientResponse.AddHeader("Content-Length", response.Headers["Content-Length"]);
                    clientResponse.AppendHeader("Content-Disposition", response.Headers["Content-Disposition"]);
                    int bufferSize = 8192;
                    // default to 4K, may want to use 8K instead           
                    byte[] bytes = null;
                    bytes = new byte[bufferSize + 1];
                    System.IO.Stream stream = response.GetResponseStream();
                    int read = 0;
                    while ((InlineAssignHelper(read, stream.Read(bytes, 0, bytes.Length))) != 0)
                    {
                        clientResponse.OutputStream.Write(bytes, 0, read);
                    }
                    clientResponse.OutputStream.Flush();
                    OurBLL.LogService.WriteDownloadLog(file);
                    //close off response or else you get corrupted files
                    clientResponse.End();
                }
            }
            catch (System.Threading.ThreadAbortException ex)
            {
                //is due to response.end call.
            }
            catch (Exception ex)
            {
                //Log exception
            }
        }

当我查看F12中的响应时,我在响应中看到了预期的标题:

  • 响应:HTTP / 1.1 200 OK Pragma:no-cache
  • 内容类型:text / html
  • 服务器:Microsoft-IIS / 7.5
  • 刷新:3580
  • 内容 - 处理:附件;文件名=的test.html
  • X-Powered-By:ASP.NET
  • 日期:2013年12月11日星期三,格林威治标准时间11:19:19
  • 内容长度:222

据我所知,所有选项都显示常规下载提示。

我错过了什么?

是否有标题标签强制提示打开“打开”选项,就像你有“X-Download-Options:noopen”将其关闭一样?

我知道您可以通过在Content-Disposition标题中添加“inline”而不是附件来在浏览器中打开文件,但这不是选项,因为它会在当前窗口中打开页面而我必须保留文件浏览开放。

1 个答案:

答案 0 :(得分:0)

我有同样的问题。这就是我发现的:

  • 如果您选择另一个“默认程序”而不是Internet Explorer来打开html文件,您将获得“打开”选项。

注意:这仅适用于html文件。例如,如果您下载pdf文件并且打开​​pdf的默认程序设置为Internet Explorer,您仍将获得“打开”选项。

任何人都有更好的解决方案吗?