Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Szybkość wgrywania pliku
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
Fafu
Witam!
Używając Flash i JavaScript zrobiłem upload z paskiem postępu.
Flash wywołuje funkcję progress(bytesLoaded, bytesTotal) w javascript a później są obliczane procenty wgrania pliku i pokazuje się pasek postępu.
To działa bardzo ładnie ale chciałbym jeszcze na podstawie tego obliczyć prędkość wgrywania pliku. Niby nic trudnego ale funkcja progress() jest wywoływana kilka razy na sekundę :/ Czy miałby ktoś pomysł jak coś takiego wykonać? Próbowałem tak ale to nie bardzo działa:
[JAVASCRIPT] pobierz, plaintext
  1. var old_second = 0;
  2. var seconds = 0;
  3. var old_bytes = 0;
  4. function progress(bytesLoaded, bytesTotal) {
  5. sec = new Date().getSeconds();
  6. if(old_second != sec) {
  7. seconds += sec;
  8. old_second = sec;
  9. }
  10. speed = old_bytes/old_second;
  11. old_bytes = bytesLoaded-old_bytes;
  12. document.getElementById('time').innerHTML = speed;
  13. }
[JAVASCRIPT] pobierz, plaintext
wookieb
Wiec uruchamias interval co sekunde.
W progress zapisujesz ilosc pobranych bajtow oraz calkowita liczbe bajtow.
Co sekundę odejmujesz liczbę pobranych bajtów oraz zapisujesz liczbe zapisanych bajtow (oldIntervalBytesLoaded) i odpowiednio przeliczasz.

pseudokod
Kod
var oldIntervalBytesLoaded:Number = 0;
var globalLoadedBytes:Number = 0;
function progres():void
{
globalLoadedBytes = loadedBytes;
}

function each1second():void
{
(globalLoadedBytes - oldIntervalBytesLoaded); // liczba pobranych bajtow w ciagu ostatnieg sekundy
oldIntervalBytesLoaded = globalLoadedBytes;
}


P.s. Po co łączysz flash + javascript skoro sam flash sa sobie z tym świetnie rade?
Fafu
Dobra, zrobiłem tak jak powiedziałeś ale pokazuje mi prędkość cały czas albo 32768 albo 65536 i czasami 0...
wookieb
To pokaż cały kod AS i javascript.
I pytam nadal dlaczego js skoro flash wystarczy? smile.gif
Fafu
Kod actionscript:
[JAVASCRIPT] pobierz, plaintext
  1. import flash.net.FileReference;
  2. var reference:FileReference = new FileReference();
  3. var referenceListener:Object = {};
  4. var scriptLocation:String = 'upload.php';
  5. reference.addListener(referenceListener);
  6. referenceListener.onSelect = activateUploadButton;
  7. referenceListener.onProgress = updateProgress;
  8. referenceListener.onHTTPError = handleError;
  9. referenceListener.onIOError = handleError;
  10. referenceListener.onSecurityError = handleError;
  11. referenceListener.onUploadCompleteData = CompleteData;
  12. chooseButton_mc.onRelease = choose;
  13. var uploadSpeed:Number = 0;
  14. var oldIntervalBytesLoaded:Number = 0;
  15. var globalLoadedBytes:Number = 0;
  16. var intervalID;
  17.  
  18. function activateUploadButton():Void {
  19. if(reference.size > max_size) {
  20. getURL ("java script:alert('Plik który wybrałeś jest zbyt duży!');");
  21. } else {
  22. reference.upload(scriptLocation);
  23. intervalID = setInterval(function(){ updateSpeed(); }, 1000);
  24. }
  25. }
  26. function choose():Void {
  27. reference.browse([{description:extensions, extension:extensions}]);
  28. }
  29. function handleError(errorName:String, detail:Object):Void {
  30. restart();
  31. if (arguments.length === 2) {
  32. if (typeof detail === 'number') {
  33. getURL ("java script:alert('HTTP Error #"+detail+"');");
  34. } else {
  35. getURL ("java script:alert('Security Error: "+detail+"');");
  36. }
  37. } else {
  38. getURL ("java script:alert('IO Error');");
  39. }
  40. }
  41. function updateProgress(fileReference:FileReference, bytesLoaded:Number, bytesTotal:Number):Void {
  42. getURL ("java script:progress("+bytesLoaded+", "+bytesTotal+", "+uploadSpeed+");");
  43. globalLoadedBytes = bytesLoaded;
  44. }
  45. function CompleteData(fileReference:FileReference, data:String):Void {
  46. getURL ("java script:complete('"+data+"');");
  47. clearInterval(intervalID);
  48. }
  49.  
  50. function updateSpeed() {
  51. uploadSpeed = (globalLoadedBytes - oldIntervalBytesLoaded);
  52. oldIntervalBytesLoaded = globalLoadedBytes;
  53. }
[JAVASCRIPT] pobierz, plaintext

Javascript jest nieistotny.
wookieb
No i dobrze. tylko js nie powinieneś wywoływać js co każde zdarzenie onprogress tylko co zdarzenie intervalu i przekazywac w parametrze ilosc załadowanych bajtów.
Fafu
Dobra, chyba działa, dzięki winksmiley.jpg
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.