[php / javascript] Voortgang van upload *

Pagina: 1
Acties:
  • 181 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hey,

Ik heb in php een pagina gemaakt die een bestand upload en de gegevens die in dat bestand staan in een database zet.
Werkt allemaal erg leuk, maar als het een redelijk groot bestand is, duurt het even voordat alles in de database is gezet. Nu leek het mij leuk om tijdens de upload de voortgang weer te geven in de vorm van een percentage of een mooie gekleurde balk die de voortgang representeert.
Is dit mogelijk met php in combinatie met js ? Is dit eenvoudig ? Heeft iemand misschien een voorbeeldje ?

Op google kon ik niet zo snel iets vinden...

Tx

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Sorry, vergeet de titel af te maken:
[php / javascript] Voortgang van upload

Tx

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
met php is dat zowieso niet mogelijk. dat is puur server side. Je zou het kunnen oplossen met een animated gif.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Dit is via het HTTP protocol niet te doen in ieder geval.

[edit]
Ik bedenk me net dat het misschien wel mogelijk is, maar ik betwijfe of het mogelijk is met PHP.

[ Voor 49% gewijzigd door Verwijderd op 26-01-2003 20:28 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je zou erover kunnen denken om het met een applet te doen (of met flash misschien? daar heb ik verder geen ervaring mee)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • S_E_B
  • Registratie: Oktober 2002
  • Laatst online: 02-09-2015
misschien zou je de tempfilesize kunnen opvragen met php en deze weer doorgeven aan je javascriptje (geen flauw idee of het werkt hoor)

en een voorbeeldje, bij de hema-fotouploadservice hebben ze zo'n progress metertje

Acties:
  • 0 Henk 'm!

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
wat ik hier en daar lees, is het niet mogelijk zonder trucjes. Je zou het beste flash of een java applet (dus geen jscript) kunnen gebruiken volgensmij. Laat wel ff weten in deze thread hoe je het hebt opgelost....:p
edit:

wat ik ook lees, is dat veel mensen een animated gifje van een progress-bar gebruiken tot het bestand is ge-upload...

[ Voor 20% gewijzigd door chris op 26-01-2003 21:35 . Reden: extra info ]


Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Gebruik flash, dat werkt perfect!
Ik gebruik het zelf ook op een site.

[ Voor 5% gewijzigd door wboard op 26-01-2003 21:35 ]

A smooth sea never made a skilled sailor


Acties:
  • 0 Henk 'm!

  • KnEuTeR
  • Registratie: Mei 2000
  • Laatst online: 24-02-2024

KnEuTeR

iedereen heeft een handelsmerk

de enige die ik ken is op HEMA.nl voor de fotoservice, en die werkt serverside. je krijgt een schermpje te zien die elke 2 seconden ofzo refresht, en een ASP pagina aanroept die dan als output de vordering laat zien.

Computers ain't that smart, Whatever man built could be taken apart


Acties:
  • 0 Henk 'm!

Verwijderd

Met aspupload kan het in ASP, dus het zal vast ook wel in PHP kunnen. Maar of daar een lib voor is?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Die aspupload is wel wat er wordt gevraagd, maar is niet gemaakt 'in', maar voor asp (waarschijnlijk ook nog in combinatie met IIS). Het neemt de upload functionaliteit van de webserver over.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

ben er ooit mee bezig geweest (allleen nooit afgemaakt...)
Dit is iets wat ik nog tegenkwam...
I did something once where I was generating a file that was large about 500K and I wanted to let the user know how the progress was going when the file was being created. I did something like: When the user hit submit on the form, two forms would be submitted, one to the main generator script and another to a progress script. What happened was I passed the name of the file that was to be generated to the progress script the other info to the generator script. The generator script created the file (a pdf) and it took a while on a certain server, like 60 seconds. While that script was working the progress script (in a pop up window) would show a percentage of how much of the file was generated via a progress bar. It would refresh itself every second or so.

The advantage I had in this situation was that I knew how big the file was going to be and the name of it so I could have the progress script checking it every second.

So, if you can find out the name of the tmp that php is generating during the upload, you might be able to update the user on how much has been uploaded.

Michael
Ik weet niet of het werkt want $_FILES['userfile']['tmp_name'] is waarschijnlijk pas gevuld als de upload klaar is...

Acties:
  • 0 Henk 'm!

Verwijderd

Flash ?! Doe je dat dus in combinatie met Flash en PHP of hoe moet ik dat zien en heb je wellicht een voorbeeld daarvan!?

Interessant! :P

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
Ik weet wel dat je in perl flush control hebt, op een of andere manier kun je dan steeds wat data naar de browser sturen op de manier zoals jij wilt. Ik weet niet of dit ook bestaat voor PHP, maar het is zeker de moeite waard om het even op te zoeken!

Acties:
  • 0 Henk 'm!

  • oh,when?
  • Registratie: April 2000
  • Niet online

oh,when?

...

PHP upload toch standaard naar de /tmp directory? Dan zou je zoiets kunnen doen als:

1) user hit upload button
2) je laad een flash movie
3) flash movie roept een serverside script aan ( in dit geval php )
4) php leest de grootte van de file uit + de grootte van de file in de tmp directory ( misschien in 2 aparte stappen )
5) php script geeft dat door aan Flash
6) omdat je nu de tijdsduur + filegrootte + aantal upgeloaden bytes weet kun je dus ongeveer uitrekenen hoe lang je nog te gaan hebt
7) scale de lengte van je progressbar in aantal % van het totaal

zoiets zou ik dus gaan doen...kweet alleen niet of PHP toestemming heeft om de /tmp uit te lezen.

HTH :)

"You're only as good, as what you did last week."


Acties:
  • 0 Henk 'm!

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 13:29
Janoz schreef op 27 januari 2003 @ 09:36:
Die aspupload is wel wat er wordt gevraagd, maar is niet gemaakt 'in', maar voor asp (waarschijnlijk ook nog in combinatie met IIS). Het neemt de upload functionaliteit van de webserver over.
Ook zonder aspupload kan je in asp de upload-progress bijhouden. In asp lees je namelijk met de functie Request.BinaryRead(blocksize) de postdata in. Dat doe je in een loopje totdat je alles hebt en in dat zelfde loopje kan je html uitvoeren of javascript genereren die een progressbar aanstuurt.
Nadeel is wel dat je zelf de postdata moet decoderen.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
oh,when? schreef op 27 January 2003 @ 17:51:
PHP upload toch standaard naar de /tmp directory? Dan zou je zoiets kunnen doen als:

1) user hit upload button
2) je laad een flash movie
3) flash movie roept een serverside script aan ( in dit geval php )
4) php leest de grootte van de file uit + de grootte van de file in de tmp directory ( misschien in 2 aparte stappen )
5) php script geeft dat door aan Flash
6) omdat je nu de tijdsduur + filegrootte + aantal upgeloaden bytes weet kun je dus ongeveer uitrekenen hoe lang je nog te gaan hebt
7) scale de lengte van je progressbar in aantal % van het totaal

zoiets zou ik dus gaan doen...kweet alleen niet of PHP toestemming heeft om de /tmp uit te lezen.

HTH :)
Het probleem is dan eigenlijk dat als je al in de tmp mag lezen, om dan achter het juiste bestands naam te komen. Want zoals al eerder gezegd is de filesize alleen op te vragen als het bestand volledig is geupload dus kun je ook niet zo makkelijk aan de bestands grote komen en daarmee de progress uit rekenen.

En als je asp gaat gebruiken dan moet je er wel aan denken dat je alles ook met asp verwerkt. (of blaat ik nou :? )

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
Hoe bedoel je dat, je kunt toch gewoon alleen een asp-script gebruiken voor de upload, of het echt fijn is weet ik niet. Is het installeren van een perl/cgi programma een probleem? Zoniet, dan kun je nogeens kijken naar mijn vorige post.

Acties:
  • 0 Henk 'm!

Verwijderd

Burning Bytes is de enigste hiero die wat interresants neer pluurt. mzz daar moet ik maar ff naar kijken eerdaags.
Want php word pas aangeroepen als het bestand klaar is met uploaden. Anders kan je hem gewoon flushen natuurlijk.

Acties:
  • 0 Henk 'm!

  • oh,when?
  • Registratie: April 2000
  • Niet online

oh,when?

...

Ik kom ff terug op mijn vorige post: [rml]oh,when? in "[ php / javascript] Voortgang van upload "[/rml]

heb nog ff wat rondgezocht, en PHP zal alleen de pagina refreshen zodra de file helemaal is upgeload. Daar kun je dan nog omheen, door op de submit aan het onClick event te hangen, die een popup opent, met daarin de flash progress bar, maar dan zit je met een paar problemen:

- je weet niet hoe de file heet in de /tmp directory ( zou je misschien kunnen sorteren op date en dan de laatste pakken oid? )
- je weet niet hoe groot de uiteindelijke file is ( dus je kan eigenlijk geen progress weergeven )

dus eigenlijk moet je dus ook een manier vinden om de totale grootte van een bestand te achterhalen, zodra je op de submit ramt...als je nu misschien de filetype weet, dan is er misschien van een bepaalde file de grootte te achterhalen door de raw bytes te lezen ( als dit word opgeslagen aan het begin van een file? )

just some ideas :)

"You're only as good, as what you did last week."


Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Ik heb hetzelfde probleem opgelost door mbv javascript een div weer te geven die eruit ziet als een progressbar. Deze DIV staat in een ander frame dan het upload script.

In hetzelfde frame staat tevens een javascript functie "setProgress(percent)". Het upload script echo-t iedere x procent (afhankelijk van de bestandsgrootte) een <script>setProgress(x);</script>
naar de client.

Voordat ik de javascript code naar de client zend, roep ik de volgende PHP code aan:
PHP:
1
2
3
for ($i=0; $i<300; $i++) print (" ");
print ("\n");
flush();

om de buffer van de client vol te laten lopen, zodat mijn javascript code wordt geparsed.

Vervolgens dus iedere x procent mijn javascript code + wederom een
PHP:
1
flush();

[ Voor 6% gewijzigd door B-Man op 27-01-2003 23:26 ]


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Verwijderd schreef op 27 January 2003 @ 09:12:
Met aspupload kan het in ASP, dus het zal vast ook wel in PHP kunnen. Maar of daar een lib voor is?
Deze werkt ook in PHP ... :)

Alles wat je in ASP kan, kan je ook in PHP....

offtopic:
Andersom ook trouwens

[ Voor 15% gewijzigd door LuCarD op 28-01-2003 10:19 ]

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
B-Man schreef op 27 January 2003 @ 23:25:
Ik heb hetzelfde probleem opgelost door mbv javascript een div weer te geven die eruit ziet als een progressbar. Deze DIV staat in een ander frame dan het upload script.

In hetzelfde frame staat tevens een javascript functie "setProgress(percent)". Het upload script echo-t iedere x procent (afhankelijk van de bestandsgrootte) een <script>setProgress(x);</script>
naar de client.

Voordat ik de javascript code naar de client zend, roep ik de volgende PHP code aan:
PHP:
1
2
3
for ($i=0; $i<300; $i++) print (" ");
print ("\n");
flush();

om de buffer van de client vol te laten lopen, zodat mijn javascript code wordt geparsed.

Vervolgens dus iedere x procent mijn javascript code + wederom een
PHP:
1
flush();
Dus als ik het goed begrijp dan heb je twee frames. Het ene frame bevat steeds de php pagina die een javascript pagina produceert, die dan een commando door geeft aan de pure javascript pagina, die dan eerst de progressbar update en dan de php pagina in de andere frame weer laat refreshen. :? of heb ik het mis?

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Mssn heb je wat aan de links die hiertussen zitten:

Google result

edit:

Hmm... niet zoveel dus: ASP :(

[ Voor 16% gewijzigd door Verwijderd op 29-01-2003 11:37 ]


Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Michali: nee, er wordt niets gerefreshed.

Ik heb twee frames: een balk bovenaan het venster, en een frame dat de rest opvult. Het bovenste frame is een HTML pagina, die wat javascript code bevat voor het weergeven van een progressbar. Het grote frame bevat de pagina die een upload verwerkt, en de gegevens in het geuploade bestand verwerkt. Gedurende het verwerken van de upload wordt en gekeken hoever het proces is, en worden en javascript statement naar de client verzonden. Als de upload/verwerking voltooid is, wordt de rest van de pagina achter de javascript code gezet (je hebt dan dus een aantal <script> tags voor je <HTML> tag staan). Er wordt nergens een pagina gerefreshed.

Acties:
  • 0 Henk 'm!

  • Anders
  • Registratie: December 2000
  • Laatst online: 13-09 18:52
Heb je het ergens werkend staan? Voor zover ik het altijd begrepen heb, kun je - in PHP/Apache althans - de grootte van een geupload bestand pas aflezen nadat deze geheel binnen is, niet terwijl die op de server binnenkomt. Maar blijkbaar kan dat dus wel?

Ik spoor veilig of ik spoor niet.


Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Nee, da's waar. Ik geef dan ook niet de status weer van de upload, maar van de verwerking van het bestand. M.b.t. het tonen van voortgang van een upload kan ik je niet verder helpen. Ik ga dit zelf oplossen met een applet.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
B-Man schreef op 30 januari 2003 @ 14:29:
Nee, da's waar. Ik geef dan ook niet de status weer van de upload, maar van de verwerking van het bestand. M.b.t. het tonen van voortgang van een upload kan ik je niet verder helpen. Ik ga dit zelf oplossen met een applet.
Maar wat gebeurt er in dat javascriptje dan? Kun je niet net zo goed een animated gif maken die een indicatie geeft van dat er ge-upload wordt? Ik heb wel van iemand gehoord dat animated gifs still staan nadat er verzonden is. Dan zou die gif in een ander frame mischien wel gewoon doorlopen.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Ik heb het over de verwerking van de gegevens in het bestand dat zojuist is geupload. Mijn javascript code wordt dus pas uitgevoerd als het bestand geheel ontvangen is.

Acties:
  • 0 Henk 'm!

  • KolNedra
  • Registratie: September 2001
  • Laatst online: 18-04-2020

KolNedra

...

Ik denk dat je eerst beter een "kleiner" probleem kan oplossen

Hoe haal je met PHP de bestandsgrootte van een bestand dat word geupload?

[ Voor 41% gewijzigd door KolNedra op 06-05-2003 17:07 ]

::: flickr.com/kolnedra ::: Nikon D80 + Sigma 18-200mm f/3.5-6.3 DC + Sigma 10-20mm f/4-5.6 EX DC HSM


Acties:
  • 0 Henk 'm!

Verwijderd

Kun je de upload faciliteit van PHP/Apache niet vervangen met eigen code ipv van de standaard code? :S Dan zou je in principe je eign apache module en of php script kunnen maken die alle uploads afhandeld op de webserver.

Acties:
  • 0 Henk 'm!

  • KolNedra
  • Registratie: September 2001
  • Laatst online: 18-04-2020

KolNedra

...

Hier draai dit scriptje eens:
PHP:
1
2
3
4
5
6
7
<?
$d1r = "/tmp";
$dir = dir($d1r);
while ($entry = $dir->read()) { 
echo $entry." ".filesize("/tmp/$entry")."<br>";
}
?>


Zodra je begint met uploaden dat scriptje (ander venster) blijven refreshen
dan zie je een bestandje waarvan de size "oploopt"

Hoe vind je dat bestand?

Gewoon alle bestanden af gaan en kijken welke de grootste filectime() heeft

Deze 2 worden telkens veranderd, nu moet je gewoon alleen de file pakken die NIET begint met sess_
en je hebt 'm
sess_5622b28f1d61ce6daa8f835135453aea 1052234063
phpfbhpWk 1052234063

[ Voor 77% gewijzigd door KolNedra op 06-05-2003 17:18 ]

::: flickr.com/kolnedra ::: Nikon D80 + Sigma 18-200mm f/3.5-6.3 DC + Sigma 10-20mm f/4-5.6 EX DC HSM


Acties:
  • 0 Henk 'm!

  • KolNedra
  • Registratie: September 2001
  • Laatst online: 18-04-2020

KolNedra

...

Misschien leuk om te gebruiken:
.HTML FORM :

code:
1
2
3
4
5
6
7
8
9
10
11
<form name="esl"  method="post" actionu="upload.php" enctype="multipart/form-data">
  <input type="file" name="sshot">  
        <input type="submit" name="Submit" value="Submit"  onClick="upload()">
</form>   

<script>
function upload() {
file = document.esl.sshot.value;
open ('uploading.php?file='+file,'upload');
}
</script>

UPLOADING.PHP:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="refresh" content="5; url=http://www.jouwhost.com/uploading.php?file=<?=stripSlashes($file);?>">
</head>

<body bgcolor="#FFFFFF" text="#000000">
<?
$d1r = "/tmp";
$dir = dir($d1r);
$lowest = 0;
while ($entry = $dir->read()) { 
  $ent = explode("_",$entry);
  if (((filectime("/tmp/$entry") > $lowest) && ($ent[0] != "sess") && (filesize("/tmp/$entry") > 1024))) { 
    echo $entry;
  }
}
?>

</body>
</html>


Met het bestand dat in uploading.php wordt ge-echoed moet je gaan spelen

[ Voor 47% gewijzigd door KolNedra op 06-05-2003 17:33 ]

::: flickr.com/kolnedra ::: Nikon D80 + Sigma 18-200mm f/3.5-6.3 DC + Sigma 10-20mm f/4-5.6 EX DC HSM


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 12:54

Bosmonster

*zucht*

Geen idee waarom dit topic gekicked wordt van Januari dit jaar, maar goed..

Makkelijkste is even een layertje onsubmit over je formulier heen te gooien en de submitknop te disablen.

In dat layertje heb ikzelf een tekst staan als:

"Bezig met uploaden bestand. Afhankelijk van uw internetverbinding en de grootte van het bestand kan dit enige tijd in beslag nemen. Een moment geduld aub."

Dan weten mensen in ieder geval dat het systeem bezig is. En zodra de upload klaar is kom je uiteraard in het 'resultaat' scherm terecht en is de layer verdwenen.

[ Voor 11% gewijzigd door Bosmonster op 06-05-2003 17:40 ]

Pagina: 1