У меня есть ссылка на обработчик загрузки внутри iframe. Этот обработчик загрузки имеет «Content-Disposition: Attachment» в заголовках, чтобы заставить пользователя загрузить файл. Это работает во всех браузерах, кроме на устройствах Android. Android игнорирует файл без каких-либо ошибок или сообщений. Используя Fiddler, я могу подтвердить, что обработчик успешно запрошен, и загрузка успешно завершена, но браузер не позволяет мне сохранить или открыть файл.
Прежде чем вы скажете мне прекратить использовать фреймы, я боюсь, что в настоящее время это не вариант для меня.
Ниже приведен код для воспроизведения этой проблемы. Три файла:
- Default.aspx: содержит iframe, указывающий на DownloadPage.aspx.
- DownloadPage.aspx: содержит ссылку на Download.ashx.
- 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;
}
}
}
}
Спасибо за ваше время.