2010-09-29 3 views
4

Я вытягивал свои волосы часами, пытаясь понять это. У меня есть iframe, с которым я хочу загрузить файл. Это все работает отлично, но IFrame OnLoad не вызывается, если мой 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.

Любая помощь приветствуется.

С уважением, Байрон Кобб.

ответ

3

Ну да. onload вызывается только при загрузке документа в iframe. Операция сохранения не загружает документ в фрейм; старый документ остается на месте, а диалог «Сохранить-как» вызывается.

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

Между прочим:

onload:'javascript:alertReady();' 

сомнительно. Вы не нуждаетесь и не должны использовать javascript: в атрибутах обработчика событий (это только для URL-адресов, которые также никогда не должны использоваться!). И установка атрибута обработчика события для строки из JS очень изворотлива. Передача onload: alertReady была бы лучше, или с тех пор, как вы используете jQuery, используйте стандартные методы привязки, такие как iframe.load(function() { ... });.

+0

Спасибо. У меня есть моя загрузка таким образом, потому что я пытался использовать все возможные решения для onload, прежде чем понял, что это из-за contenttype. – Bob

+0

mmm Я задал аналогичный вопрос http://stackoverflow.com/questions/17184970/iframe-onload-wont-fire-when-dumping-a-file –

Смежные вопросы