ugrás a tartalomhoz

PHP+AJAX+JS fájl-feltöltés mérő

Velias9 · 2008. Szep. 10. (Sze), 15.14
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:

<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>
Aztán:

<!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>
Status.php:

<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&nbsp;MB/170.11&nbsp;MB (17.43&nbsp;KB/sec)<br /> 00:09:01<br /> 02:37:34</span>
	</div>
	</div>
</body>
</html>
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!
 
1

SESSION

Poetro · 2008. Szep. 10. (Sze), 16.09
A PHP oldalon ellenőrzöd a feltölteni kívánt fájlt ($_FILES tömb, illetve is_uploaded_file). Eltárolod SESSION-ben a file elérési útját ($_FILES['file_mezo_neve']['tmp_name']) és máris tudod ellenőrizgetni, csak sessionből kell lekérdezni az elérési utat. Mivel kettő feltöltés is futhat párhuzamosan, nem árt, ha a formod mindig kap valami egyedi azonosítót hogy tudd most akkor melyik feltöltésedről is van szó. A $_FILES['file_mezo_neve']['size'] adja vissza a fájl méretét.
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.
3

$_FILES

SamY · 2008. Szep. 11. (Cs), 07.26
PHP -ból ez a dolog azért nem ment tökéletesen sosem mert a $_FILES már csak akkor jön létre mikor feltöltődött a fájl, addig az apache hozzá sem szól a php -hoz. lehet, hogy más webszerver alatt ez máshogyan működik, de az Apache úgy tudom így csinálja. Annó találtam egy ügyeskedést ami megkeresi a tmp könyvtárban a legutolsó feltöltés alatt lévő fájlt, és annak a méretét nézegeti. Érdemes a körülnézni a "php upload progress bar" kulcsszavakra, bár nagyon sok a CGI megoldásos találat.
2

Van egy régi hackes megoldás, amiben egy (perl) cgi csak annyi

Fraki · 2008. Szep. 10. (Sze), 17.46
Van egy régi hackes megoldás, amiben egy (perl) cgi csak annyi szerepet játszott, hogy megkaptad a fájl méretét. A többi php volt.

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
4

Flash upload?

janoszen · 2008. Szep. 11. (Cs), 08.25
Próbálkozz meg a flash filefeltöltéssel, az alapból tud progress bart és talán netről le is lehet tölteni ilyesmit, sokkal kevesebb szívás mint JS-sel hackelni, patchelgetni a PHP forrást, stb.