下载文件时iframe onload

时间:2010-09-29 09:32:06

标签: c# javascript jquery iframe download

我一直把头发拉了几个小时试图解决这个问题。 我有一个iframe用于下载文件。一切正常,但如果我的Response.ContentType = "APPLICATION/OCTET-STREAM";

,则不会调用iframe onload

我的javascript功能如下:

function DownloadStuff(){
var DownloadSource = "http://Apage.aspx"
        var iframe = $("#hiddenDownloader");
        if (iframe.attr("id") === undefined) {
            $('<iframe />', { id: 'hiddenDownloader',  onload:'javascript:alertReady();' }).appendTo('body');
            iframe = $("#hiddenDownloader");
        }
iframe.attr('src', DownloadSource);
}

function alertReady() {
    alert("Ready");
}

我的服务器端代码如下:

Response.Clear();
Response.CacheControl = "no-cache";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetValidUntilExpires(false);
Response.ExpiresAbsolute = DateTime.Parse("1/1/2000");
Response.Expires = 0;
Response.ContentType = "APPLICATION/OCTET-STREAM";
Response.AddHeader("Content-Disposition", "attachment;filename=\"ReportDeck.pptx\"");
byte[] bytes = (byte[])PowerPointFile.Tables[0].Rows[0]["PPTBlob"];
bytes = Compression.DeCompressByteArray(bytes);
Response.OutputStream.Write(bytes, 0, bytes.Length);

如果我删除ContentType和Header,则会调用onload,但是文件不会通过保存文件对话框下载,而是写入iframe。

感谢任何帮助。

此致 Byron Cobb。

1 个答案:

答案 0 :(得分:4)

好的,是的。只有在将文档加载到iframe时才会调用onload。保存操作不会将文档加载到框架中;将旧文档留在原位并弹出另存为对话框。

您无法仅通过JavaScript检测到文件下载已被接受或完成。如果你真的需要检测它,你能得到的最接近的是必须让服务器端通过唯一的ID存储下载的进度,并为客户端脚本提供一个AJAX接口来查询服务器是否已完成发送文件。

顺便提及:

onload:'javascript:alertReady();'

值得怀疑。您不需要也不应该在事件处理程序属性中使用javascript:(仅适用于href="javascript:..." URL,这些URL也应该永远不会被使用!)。将事件处理程序属性设置为JS中的字符串是非常狡猾的。直接传递onload: alertReady会更好,或者因为你使用jQuery使用标准的绑定方法,如iframe.load(function() { ... });