PHP+AJAX+JS fájl-feltöltés mérő
Sziasztok!
Ez a téma már előkerül egy korábbi témán belül, de nem találtam meg, és az emlékeim szerint nem lett kidolgozva, csak, mint ötlett lett felvetve.
Az ötlet az volt, hogy a fájlt normál módon töltjük fel (pl.: iframe), aztán bizonyos időközönként kérdést küldünk a szervernek (itt jön az AJAX), hogy mekkora a fájl mérete. Ebből azt adatból és a fájl eredeti méretéből kiszámolható, hogy hol tart a feltöltés.
A problémám a következő:
- honnan tudom, hogy mi a fájl neve
- honnan tudom, hogy mekkora volt az eredeti mérete
A megvalósítás ötlete a FreeMail-ről származik. Ennyit sikerült kihámoznom belőle (nem segít sokat):
Eredeti from:Aztán:Status.php:A forrásokon néhány sortörés kivételével nem változtattam.
A CGI, Flash és egyéb megoldások nem játszanak (egyébként ezekről is volt említés abban a témában, de nem voltak kidolgozva).
Ha valaki tudja, hogy melyik volt az a téma, akkor legyen szives a válaszában linkelje be!
Előre is köszönöm a (lehetséges) linket és a segítséget!
■ Ez a téma már előkerül egy korábbi témán belül, de nem találtam meg, és az emlékeim szerint nem lett kidolgozva, csak, mint ötlett lett felvetve.
Az ötlet az volt, hogy a fájlt normál módon töltjük fel (pl.: iframe), aztán bizonyos időközönként kérdést küldünk a szervernek (itt jön az AJAX), hogy mekkora a fájl mérete. Ebből azt adatból és a fájl eredeti méretéből kiszámolható, hogy hol tart a feltöltés.
A problémám a következő:
- honnan tudom, hogy mi a fájl neve
- honnan tudom, hogy mekkora volt az eredeti mérete
A megvalósítás ötlete a FreeMail-ről származik. Ennyit sikerült kihámoznom belőle (nem segít sokat):
Eredeti from:
- <head>
- <link rel="stylesheet" type="text/css" href="/gfx/popup.css" media="screen, projection" />
- <meta http-equiv="Content-Script-Type" content="text/javascript" />
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
- <meta name="robots" content="all" />
- <script type="text/javascript" language="JavaScript">
- <!--
- function kuld() {
- if (document.upload.hm.value == '') {
- alert('Hiányzó fájlnév');
- return;
- }
- parent.progress.location.href = "status.php?id=87e716b57c96f9448f103bfd0ac4f4e5";
- document.upload.submit();
- }
- function torol() {
- document.upload.reset();
- }
- //-->
- </script>
- </head>
- <body>
- <form enctype="multipart/form-data" name="upload" action="complete.php" method="post">
- <input type="hidden" name="file_upload_status_uniqueid" value="87e716b57c96f9448f103bfd0ac4f4e5">
- <input type="hidden" name="email" value="velias_##kukac##freemail.hu">
- <img src="/gfx/freemail-logo.gif" class="logogif" alt="" />
- <div id="cim"><span>Óriásfájl csatolása</span></div>
- <label for="csatoltfile" class="label-ofile">Csatolt file:</label>
- <input type="file" id="csatoltfile" name="hm" />
- </form>
- </body>
- </html>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="hu">
- <head>
- <title>[freemail] - Óriásfájl</title>
- <link rel="Shortcut Icon" type="image/ico" href="/gfx/favicon.ico" />
- <link rel="stylesheet" type="text/css" href="/gfx/cimlap.css" media="screen, projection" />
- </head>
- <frameset rows="105,*" scroll="none" frameborder="0" framespacing="0">
- <frame src="upload.php?email=velias_##kukac##freemail.hu" name="upload">
- <frame src="bottom.php" name="progress">
- </frameset>
- <noframes>
- </noframes>
- </script>
- </html>
- <head>
- <title>[freemail]</title>
- <link rel="stylesheet" type="text/css" href="/gfx/cimlap.css" media="screen, projection" />
- <meta http-equiv="Content-Script-Type" content="text/javascript" />
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
- <meta name="robots" content="all" />
- <meta http-equiv="Refresh" Content="1; URL=/oriaslevel/status.php?id=87e716b57c96f9448f103bfd0ac4f4e5&start_time=1221051848">
- </head>
- <body id="inner-body">
- <div id="popup-ablak">
- <div id="szelesseg-ofile" style="display:block;">
- <span id="allapot-ofile">Feltöltés folyamatban 5% <br /><img src="/gfx/tarhely1.gif" height="19" width="19" /><img src="/gfx/tarhely0.gif" height="19" width="336" /></span>
- <span id="baloszlop-ofile">Státusz: <br />Eltelt idő: <br />Várható befejezés:</span>
- <span id="jobboszlop-ofile">9.21 MB/170.11 MB (17.43 KB/sec)<br /> 00:09:01<br /> 02:37:34</span>
- </div>
- </div>
- </body>
- </html>
A CGI, Flash és egyéb megoldások nem játszanak (egyébként ezekről is volt említés abban a témában, de nem voltak kidolgozva).
Ha valaki tudja, hogy melyik volt az a téma, akkor legyen szives a válaszában linkelje be!
Előre is köszönöm a (lehetséges) linket és a segítséget!
SESSION
Az egyetlen probléma az egésszel, hogy a PHP egészen addig nem kap vezérlést, ameddig a file nincs teljesen feltöltve, azaz a fenti út alapból járhatatlan, mivel nem állnak rendelkezésre az adatok. Ha jól emlékszem akkor létezik valamilyen PHP kiegészítés amivel a dolgot meg lehet valósítani, de a nevét nem tudom.
A Flash megoldása különbözik, a Flash ugyanis azt tudja a felhasználó mennyit töltött fel, és nem azt, mennyi érkezett meg a szerverhez, és hogy azt a szerver feldolgozta-e. Azaz a feltöltés után a Flashnek általában várakoznia kell amíg megkapja a választ, hogy a feltöltött fájlt feldolgozták, de addig is ki lehet írni, hogy feltöltés kész, feldolgozás folyamatban.
A CGI megoldás tökéletesen tudja azt amit az imént felvázoltam PHP esetén, csak itt működik is.
$_FILES
Van egy régi hackes megoldás, amiben egy (perl) cgi csak annyi
A vezérlés először a cgi-hez ment – ugye minden iframe-be van targetolva –, ami rögtön visszaadta a fájlméretet. Ezután a kliensoldal elkezdte felküldeni a fájlt, s közben elkezdett ajaxszal pollozni egy másik szkriptet, ami nézegette a feltöltődő fájl méretét. Hogy melyik fájl méretét kell néznie, arra nem volt 100%-os az algoritmus, a rendszer temp könyvtárában keresett új phpXXXX nevű fájlt. Épp emiatt nem is volt használható több feltöltésre egy szájton, haha.
Linket erre nem tudok adni, mert a szerzője már az új módszert propagálja, arra viszont van link:
http://webreflection.blogspot.com/2007/10/upload-progress-bar-with-php5-apc-and.html
Flash upload?