Android игнорирует Content-Disposition: вложение внутри Iframe

У меня есть ссылка на обработчик загрузки внутри iframe. Этот обработчик загрузки имеет «Content-Disposition: Attachment» в заголовках, чтобы заставить пользователя загрузить файл. Это работает во всех браузерах, кроме на устройствах Android. Android игнорирует файл без каких-либо ошибок или сообщений. Используя Fiddler, я могу подтвердить, что обработчик успешно запрошен, и загрузка успешно завершена, но браузер не позволяет мне сохранить или открыть файл.

Прежде чем вы скажете мне прекратить использовать фреймы, я боюсь, что в настоящее время это не вариант для меня.

Ниже приведен код для воспроизведения этой проблемы. Три файла:

  1. Default.aspx: содержит iframe, указывающий на DownloadPage.aspx.
  2. DownloadPage.aspx: содержит ссылку на Download.ashx.
  3. Download.ashx: отвечает типом содержимого text/plain с расположением содержимого: вложение

По умолчанию.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>

СкачатьPage.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>

Скачать.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;
            }
        }
    }
}

Спасибо за ваше время.


person Markus    schedule 10.09.2012    source источник


Ответы (1)


большинство браузеров будут делать это в качестве меры безопасности, чтобы избежать вредоносных встроенных автоматических загрузок. вы можете предоставить пользователю ссылку или кнопку для завершения загрузки, чтобы браузер распознал взаимодействие и разрешил завершить загрузку.

person bizzehdee    schedule 09.07.2013