Android忽略Content-Disposition:Iframe内的附件

时间:2012-09-10 13:09:20

标签: android html http http-headers

我有一个iframe内部下载处理程序的链接。此下载处理程序在标头中包含“Content-Disposition:Attachment”以强制用户下载文件。这适用于Android设备上除之外的所有浏览器。 Android忽略该文件没有任何错误或消息。使用Fiddler,我可以确认处理程序已成功请求,&下载似乎已成功完成,但浏览器不允许我保存或打开文件。

在你告诉我停止使用iframe之前,我恐怕此时不适合我。

以下是重现此问题的一些代码。三个文件:

  1. Default.aspx:包含指向DownloadPage.aspx
  2. 的iframe
  3. DownloadPage.aspx:包含Download.ashx
  4. 的超级链接
  5. Download.ashx:使用内容处置的文本/纯文本内容类型回复:附件
  6. Default.aspx的:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AndroidTest.Default" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <iframe src="DownloadPage.aspx" width="320" height="1000"></iframe>
        </div>
        </form>
    </body>
    </html>
    

    DownloadPage.aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DownloadPage.aspx.cs" Inherits="AndroidTest.DownloadPage" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:HyperLink NavigateUrl="~/Download.ashx" runat="server">Download</asp:HyperLink>
        </div>
        </form>
    </body>
    </html>
    

    Download.ashx.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace AndroidTest {
        /// <summary>
        /// Summary description for Download
        /// </summary>
        public class Download : IHttpHandler {
    
            public void ProcessRequest(HttpContext context) {
                context.Response.ContentType = "text/plain";
                context.Response.AddHeader("Content-Disposition", "attachment;filename=\"test.txt\"");
                context.Response.Write("Hello World");
            }
    
            public bool IsReusable {
                get {
                    return false;
                }
            }
        }
    }
    

    感谢您的时间。

1 个答案:

答案 0 :(得分:0)

大多数浏览器都会将此作为安全点,以避免恶意嵌入式自动下载。您可能希望向用户显示链接或按钮以完成下载,以便浏览器识别交互并允许下载完成。