Автор Тема: Upload при помощи iframe.  (Прочитано 3612 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн anterior

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 9
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Upload при помощи iframe.
« : 01 Июля 2007, 19:26:59 »
Есть такой хтмль типа:


 
 
   
     
       
     
   
 
Прикрепленные файлы
         
       



И код на JavaScript:

function upload(form) {
  function addEvent(obj, evType, fn){
    if (obj.addEventListener) {
        obj.addEventListener(evType, fn, true);
    }
    if (obj.attachEvent) {
        obj.attachEvent(\'on\'+evType, fn);
    }
  }
  function removeEvent( obj, type, fn ) {
    if (obj.detachEvent) {
      obj.detachEvent(\'on\'+type, fn);
    }
    else {
      obj.removeEventListener(type, fn, false);
    }
  }
  function onfinish() {
    alert(window.frames[\'temp984\'].document); // вот это со 2й попытки возвращает null
    removeEvent(document.getElementById(\'temp984\'), \'load\', onfinish);
    cross = \'javascript:window.parent.onUploadSuccess(); void(0);\';
    document.getElementById(\'temp984\').src = cross;
    setTimeout(function() {
        alert(\'time!\');
        document.getElementById(\'temp984\').parentNode.removeChild(document.getElementById(\'temp984\'));
      }, 250
    );
  }

  iframe = document.createElement(\'iframe\');
  iframe.id = \'temp984\';
  iframe.name = \'temp984\';
  iframe.style.display = \'none\';
  form.parentNode.appendChild(iframe);
  window.frames[\'temp984\'].name = \'temp984\';
  form.target = \'temp984\';
  addEvent(iframe, \'load\', onfinish);
  form.submit();
}

CGI скрипт после того как загрузил файл, возвращает его размер, content-type, и т.д. или сообщение об ошибке. Вся эта информация будет лежать в window.frames[\'temp984\'].document которая описана первой строкой функции onfinish. И это работает но только для первой загрузки файла, все остальные попытки оканчиваются неудачно т.к. window.frames[\'temp984\'].document почему-то возвращает null в той самой первой строке ф-и onfinish. Почему так я не понимаю. А если например вместо удаления фрейма после загрузки файла переименовать его(iframe.id = \'\'; iframe.name = \'\') то повторные загрузки файла оканчиваются успешно но функция onfinish вызывается почему-то 2 раза и показывает информацию о последнем и предыдущем загруженном файле. Ошибок в CGI скрипте нет. Проверено! Браузер FF. Буду очень признателен если кто-нибудь скажет в чем моя ошибка.

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Upload при помощи iframe.
« Ответ #1 : 01 Июля 2007, 20:59:50 »
imho: Данный вариант сложен и все ошибки трудно будет устранить.

Опиши, что хочется получить и для чего.
0 OK, 0:1

Оффлайн anterior

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 9
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Upload при помощи iframe.
« Ответ #2 : 02 Июля 2007, 05:20:31 »
Хочется асинхронно загрузить файл (несколько файлов), затем после загрузки показать информацию о файле, его размере, имени, и т.д.

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Upload при помощи iframe.
« Ответ #3 : 02 Июля 2007, 06:10:54 »
Убери событие onchange. Добавь кнопку, типа submit.
Создай iframe раз и навсегда (без javascript\'а). Параметр src обязателен. Направь в iframe выдачу ответа с помощью target в форме.

Вот и все, ответ будет загружаться в iframe.

Определи onload событие у элемента iframe: onload="alert(this.contentWindow.document.body.innerHTML)". Это пример.
Вообще, передавать можно любые данные, тщательно их экранировав (например преобразовав к формату, понимаемому методом decodeURIComponent).

ps: однако, данный способ угробит встроенную навигацию в браузере.
0 OK, 0:1

Оффлайн anterior

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 9
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Upload при помощи iframe.
« Ответ #4 : 02 Июля 2007, 15:04:06 »
Пасибачки, разобрался

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28