2014-04-03 8 views
9

Próbuję zaimplementować formularz wysyłania i zwrócić status wysyłania, aby zwrócić do użytkownika przy użyciu xhr. Wszystko wydaje się być poprawnie zaimplementowane, jednak przy przesyłaniu wywołania zwrotne wydają się zbyt szybkie i zwracają o wiele większy procent niż faktycznie miało miejsce.Zdarzenie postępu XMLHttpRequest postępuje znacznie szybciej niż rzeczywisty upload

Z plikami ~ < 20 MB, natychmiast otrzymuję oddzwanianie, które pokazuje ponad 99%, podczas gdy przesyłanie jest kontynuowane przez pewien czas w tle.

Zobacz poniższy screengrab pokazujący konsolę z pliku 74 MB. Zostało to zrobione kilka sekund po zainicjowaniu przesyłania, a przesyłanie trwało przez kolejne ~ 60 sekund (zauważ, że tylko 3 wywołania zwrotne są rejestrowane (ładowane sumują się) (procentowy udział procentowy), a upload ajax jest kontynuowany z throberem).

Czy ktoś doświadczył tego i udało się uzyskać dokładną reprezentację statusu przesyłania?

(zdarzenie 'obciążenie' wyzwala poprawnie po procesie upload)

Oto mój kod:

$(this).ajaxSubmit({ 
    target: '#output', 
    beforeSubmit: showRequest, 
    xhr: function() 
    { 
     myXhr = $.ajaxSettings.xhr(); 
     if (myXhr.upload) 
     { 
      console.log('have xhr'); 
      myXhr.upload.addEventListener('progress', function(ev){ 
       if (ev.lengthComputable) { 
        console.log(ev.loaded + " " + ev.total); 
        console.log((ev.loaded/ev.total) * 100 + "%"); 
       } 
      }, false); 

     } 
     return myXhr; 
    }, 
    dataType: 'json', 
    success: afterSuccess 
}); 

enter image description here

+3

Może to zabrzmieć dziwnie, ale - czy przypadkiem nie zainstalowałeś żadnego programu antywirusowego? A jeśli masz, czy to samo zachowanie obserwuje się po wyłączeniu programu antywirusowego? – raina77ow

+0

Twoje sugestie mogą mieć z tym coś wspólnego. Po raz pierwszy wypróbowałem go na moim komputerze domowym (Mac, bez antywirusa) (działał na moim komputerze) i działa jak urok! Będę musiał wyłączyć program antywirusowy na komputerze roboczym i sprawdzić, czy ma to jakiś wpływ. Ogromne podziękowania dla głów! – Fraser

+0

@ raina77ow Wygląda na to, że przyczyną jest program antywirusowy. Wyłączyłem go na mojej maszynie roboczej i teraz działa świetnie. Dzięki. Pop poniżej odpowiedź, a ja uwolnię nagrodę. – Fraser

Odpowiedz

7

Istnieje kilka doniesień o tym samym zachowanie - nieprawidłowe sprawozdanie z postępów przesyłanie plików - spowodowane przez oprogramowanie antywirusowe sprawdzające pliki do przesłania. Domyślam się, że jakaś część programu antywirusowego próbuje nadrobić ewentualne opóźnienie (spowodowane przez kontrolę) - i nie robi tego poprawnie.

+0

Miał ten sam problem, to rozwiązało go. Mam nadzieję, że wkrótce uda mi się znaleźć pracę. –

+1

Czy znalazłeś jakieś obejście? mam ten sam problem ... – Benoit

1

Niedawno miałem ten sam problem. Myślę, że twoje połączenie ajaxowe jest po prostu zwracane przed przesłaniem pliku. Aby obejść ten problem, załaduj z powrotem to, co przesłałeś i sprawdź wydarzenie load. Na przykład, jeśli przesyłanie obrazu (przy użyciu jQuery):

var loadCheck = $('<img src="' + uploadedUrl +'">').hide().appendTo('body'); 
loadCheck.on('load', updateProgressBar()); 

oczywiście można wdrożyć go w innych plików typu, i zawierają $ .each iteracji.

Powiązane problemy