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?