[idee] Uploaden van files

Pagina: 1
Acties:

  • gvdh81
  • Registratie: Juli 2001
  • Laatst online: 21-03 14:46

gvdh81

To got or not to got..

Topicstarter
Iedereen die met een scripttaal aan het ***-en is, komt vroeg of laat file uploads tegen. Ik heb dan nog het geluk dat ik mijn eigen server heb, en alles zo in kan stellen als ik zelf wil...

Een voorbeeldje van mijn CGI / Prototype powered AJAX file-upload:
Afbeeldingslocatie: http://img450.imageshack.us/img450/3372/upload1wr.gif
Mijn serverload tijdens het uploaden ligt rond de 0.03, dus zeer netjes al zeg ik het zelf ;)

Ik haal uit de geposte data niet alleen de filename (zodat mijn klanten zien welk bestand ze momenteel aan het uploaden zijn), maar ook de bestandsgrootte. De status van de upload wordt door upload.cgi weggeschreven in een logfile, en via ajax calls haal ik die logfile binnen. Zodoende kan ik vervolgens weer de progressbar updaten. Dit idee is overigens gebaseerd op de file upload van http://encodable.com/tech/ajaxupload/ maar compleet herschreven zodat het aan mijn wensen voldoet. Bestandsnaam etc zit nog niet in hun versie, en ook de mogelijkheid om meerdere files te uploaden heb ik er zelf ingebouwd. Verder gebruik ik de prototype library voor mijn ajax calls en hun hadden een eigen ajax implementatie. Nu ondersteunen ze dit overigens wel, maar eerst nog niet.

Het probleem: je stelt in je config files een maximum file size in, maar hoe ga je dit je gebruikers vertellen? Stel dat je maximum file upload 50mb is, wat redelijk normaal is voor een gallery... Zeg je tegen je klanten dat ze maximaal 10 bestanden van 5mb kunnen uploaden, of zeg je dat ze 2 bestanden van 25mb mogen uploaden? Enfin, je snapt het probleem. Hoeveel file upload velden ga je maken?

Ik upload overigens niet via PHP, maar via CGI in combinatie met AJAX progressbar. De reden hiervoor is dat CGI geen instellingen heeft met betrekking tot max_execution_time etc.

Wat ik graag wil bereiken: Deze post heb ik gemaakt omdat ik denk een goed idee te hebben met betrekking tot file uploads, iets wat uitgewerkt kan worden tot een zeer gebruiksvriendelijk voorbeeld. Ik heb deze post niet gemaakt om van jullie vragen te krijgen hoe ik dingen gemaakt heb, of om mij te flamen dat ik file uploads van 50 meg toesta.

Mijn idee is als volgt: Wat als je nu één file upload field hebt. Mensen selecteren een bestand en het wordt aan de queueu gegeven, vervolgens kunnen ze een nieuw bestand selecteren Niets nieuws zul je denken, maar nu komt het: Mijn idee is om zodra mensen een bestand hebben toegevoegd aan de queue, een hidden form te submitten met enkel die file erin. Het script wat wordt aangeroepen geeft enkel en alleen de filesize terug. Ik denk dat je al snapt waar ik heen wil. Mensen kunnen zodoende net zolang files toevoegen totdat een van te voren vastgestelde limiet is behaald. Ik weet bijv. van CGI dat de content-length van te voren (voordat de file binnen is) bekend is.

Wat vinden jullie van het idee? Zou het kunnen werken? Is er misschien al zoiets? Ik hoop op serieuze reacties.

[ Voor 3% gewijzigd door gvdh81 op 28-12-2005 18:02 ]


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 18-04 05:37

alienfruit

the alien you never expected

Uuh, is het niet zo dat de file al meegestuurd wordt als je die hidden form submit? Of wil je de verbinding weer sluiten als je Content-length hebt ontvangen, en pas later voor het echie uploaden? Als je dan toch gebruik wilt maken van hidden forms kan je net zo goed ook maar één upload veld gebruiken, imho.

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Deze link is mischien wel handig voor die rij met bestanden: Multiple files with single file element. Ik gebruik het zelf ook vrij veel en werkt wel leuk.

Je kunt niet echt veel anders dan hidden submit te doen ben ik bang. Want je kunt geloof ik niet met Javascript de grootte van het bestand uitlezen.

Dit vond ik op het internet, maar werkt alleen met IE:
JavaScript:
1
2
3
4
5
6
7
8
function getFileSize()
{
var obj = new ActiveXObject("Scripting.FileSystemObject");
var fileInput = document.getElementById('uploadbestand').value;
var file = obj.getFile(fileInput);
var fileSize = file.size;
alert(fileSize + " bytes");
}

[ Voor 30% gewijzigd door eghie op 28-12-2005 19:16 ]


  • gvdh81
  • Registratie: Juli 2001
  • Laatst online: 21-03 14:46

gvdh81

To got or not to got..

Topicstarter
Inderdaad alienfruit, ik bedoel dat je dus met bijv. cgi de content-length van de file binnenhaalt, en dan de verbinding sluit. Zou het mogelijk zijn denk je?

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Niet dat ik je graag PHP wil laten gebruiken, maar volgens mij ben je nog niet bekend met deze functie. Ik denk verder overigens dat dit soort upload scriptjes niet gemakkelijk te maken zijn in PHP, dus ga lekker verder met CGI.

Noushka's Magnificent Dream | Unity


Verwijderd

Even Googlen levert mij een projectje op bij SourceForge, namelijk: Mega Upload Progress Bar
http://sourceforge.net/projects/megaupload/

  • flashin
  • Registratie: Augustus 2002
  • Laatst online: 17-12-2023
Hartstikke leuk idee, denk alleen dat het dikke (tijd) overkill is om in die talen te doen. En 0.03 cpu usage bij 1 upload NU al vind ik juist vrij veel imho. Als je een beetje een drukke site gaat krijgen wordt dat al snel een probleem. Waarom leg je dus niet de verwerking bij de client?
Ik zou gewoon de gebruikers voor de keuze laten -> html of java.
HTML gewoon standaard formulier zoals je ze overal tegenkomt
Java een multiple upload ding met queue, zijn zat voorbeelden te vinden

[ Voor 27% gewijzigd door flashin op 29-12-2005 11:01 ]


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 20-04 14:38
Je CGI/PHP script wordt pas uitgevoerd nadat het volledige bestandi s geupload, dat idee kun je dus vergeten ;(

  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

Geef naast een progress bar van de huidige upload ook een progressbar van de totale hoeveelheid upload die ze al gebruikt hebben, dus bv

uploading : 50% van file xxx.yyy (15 Mb/ 30 Mb)

70% van de beschikbare ruimte is in gebruik genomen (35 Mb / 50 Mb)

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 07:07

Reptile209

- gers -

gvdh81 schreef op woensdag 28 december 2005 @ 18:01:
[...]

Mijn idee is als volgt: Wat als je nu één file upload field hebt. Mensen selecteren een bestand en het wordt aan de queueu gegeven, vervolgens kunnen ze een nieuw bestand selecteren Niets nieuws zul je denken, maar nu komt het: Mijn idee is om zodra mensen een bestand hebben toegevoegd aan de queue, een hidden form te submitten met enkel die file erin. Het script wat wordt aangeroepen geeft enkel en alleen de filesize terug. Ik denk dat je al snapt waar ik heen wil. Mensen kunnen zodoende net zolang files toevoegen totdat een van te voren vastgestelde limiet is behaald. Ik weet bijv. van CGI dat de content-length van te voren (voordat de file binnen is) bekend is.

Wat vinden jullie van het idee? Zou het kunnen werken? Is er misschien al zoiets? Ik hoop op serieuze reacties.
Ietwat offtopic, maar toch... Wat doet deze constructie als ik 3 bestanden van, zeg, 1 kB selecteer en op jouw manier klaar zet. Voordat de upload begint, overschrijf ik ze lokaal met 3 bestanden van 100 MB met dezelfde bestandsnaam. Je script verwacht 3 kB, maar krijgt 300 MB voor zijn kiezen... Ik zou dus iig kijken naar een systeem dat (bijv. met een checksum) controleert of het bestand gelijk blijft.

Helemaal ideaal is het natuurlijk als het script ook met directories overweg kan. Zeker voor (foto) galleries is het lekker als je alleen de dir hoeft te selecteren en dat alles wat daar in staat wordt geupload. Dan moet je dus recursief de dir kunnen doorlopen.

Zo scherp als een voetbal!


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 20-04 14:38
Wat onmogelijk is met een HTML File Upload. Dan kom je dus wel bij een Java-apllet uit.
ZIP bestanden uploaden is dan misschien een betere oplossing. Er zijn genoeg libraries voor PHP om ZIP-bestanden uit te lezen.

  • Mithrandir
  • Registratie: Januari 2001
  • Laatst online: 18-04 20:33
Reptile209 schreef op donderdag 29 december 2005 @ 11:28:
[...]

Ietwat offtopic, maar toch... Wat doet deze constructie als ik 3 bestanden van, zeg, 1 kB selecteer en op jouw manier klaar zet. Voordat de upload begint, overschrijf ik ze lokaal met 3 bestanden van 100 MB met dezelfde bestandsnaam. Je script verwacht 3 kB, maar krijgt 300 MB voor zijn kiezen... Ik zou dus iig kijken naar een systeem dat (bijv. met een checksum) controleert of het bestand gelijk blijft.

Helemaal ideaal is het natuurlijk als het script ook met directories overweg kan. Zeker voor (foto) galleries is het lekker als je alleen de dir hoeft te selecteren en dat alles wat daar in staat wordt geupload. Dan moet je dus recursief de dir kunnen doorlopen.
Tsja, en laat dat nu even niet kunnen. Serverside in elk geval niet, en javascript mag ook niet bij iemand op de schijf koekeloeren. Dan kom je dus op een java applet uit.

Verbouwing


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 20-04 08:21

Janoz

Moderator Devschuur®

!litemod

@eghie: Ik hoop niet dat dat zomaar werkt. Lijkt me niet zo veilig wanneer een html pagina gewoon een filesystemobject aan kan maken en vervolgens allemaal bestanden van de HD kan gaan lopen checken...

@frickY: Dat geldt wel voor PHP, maar voor CGI hoeft dat helemaal niet.

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


  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Janoz schreef op donderdag 29 december 2005 @ 12:00:
@eghie: Ik hoop niet dat dat zomaar werkt. Lijkt me niet zo veilig wanneer een html pagina gewoon een filesystemobject aan kan maken en vervolgens allemaal bestanden van de HD kan gaan lopen checken...

@frickY: Dat geldt wel voor PHP, maar voor CGI hoeft dat helemaal niet.
En toch werkt het. Ja, het is niet veilig. Het werkt overigens alleen in IE en geloof ik ook alleen maar in de trusted zone, maar toch werkt het. Ik moest de ActiveX wel toestemming geven, maar dat kan aan m'n beveiligings instellingen liggen.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 20-04 08:21

Janoz

Moderator Devschuur®

!litemod

Ah, trusted zone. Dat is dus niet 'zomaar'. Toch blijf ik het echter suf vinden dat een html pagina mbv javascript gewoon handelingen op het file systeem uit kan voeren. Surf je naar een pagina, is ineens je explorer.exe verwijderd.

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


  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Janoz schreef op donderdag 29 december 2005 @ 13:36:
Ah, trusted zone. Dat is dus niet 'zomaar'. Toch blijf ik het echter suf vinden dat een html pagina mbv javascript gewoon handelingen op het file systeem uit kan voeren. Surf je naar een pagina, is ineens je explorer.exe verwijderd.
Mjah, het maakt onderwater eigenlijk gewoon gebruik van een ActiveX object. Dus je kunt er even veel mee als je gewoon met een ActiveX applicatie zou kunnen, die binnen de browser wordt geladen. Ik weet alleen niet wat de applicatie dan wel en niet mag, maar aan bestanden komen mag wel. Java appletjes mogen ook aan je bestanden komen. Je moet ze alleen wel toestemming geven om eraan te zitten.

  • gvdh81
  • Registratie: Juli 2001
  • Laatst online: 21-03 14:46

gvdh81

To got or not to got..

Topicstarter
wow wow heftige discussie ;)

@d4skunk: Dat kan (nu nog) helaas niet. Files worden afgehandeld as is; ik weet de content-length van de tweede file pas als de eerste helemaal is geupload. Als mijn systeem straks werkt en mensen geen rare 100mb dingen gaan doen :p dan kan ik dat dus wel, omdat ik dan van te voren weet hoeveel er (waarschijnlijk) geupload gaat worden.


quote: reptile
Ietwat offtopic, maar toch... Wat doet deze constructie als ik 3 bestanden van, zeg, 1 kB selecteer en op jouw manier klaar zet. Voordat de upload begint, overschrijf ik ze lokaal met 3 bestanden van 100 MB met dezelfde bestandsnaam. Je script verwacht 3 kB, maar krijgt 300 MB voor zijn kiezen... Ik zou dus iig kijken naar een systeem dat (bijv. met een checksum) controleert of het bestand gelijk blijft.
Mjah, jammer dan.. Ik wil iets gebruiksvriendelijk maken door maar 1 file upload veld te gebruiken, en ze toch de complete vrijheid te geven. Mijn klanten hebben een quota op hun user ingesteld en php (en cgi) draaien ook onder hun useraccount. Dus ze verspelen hun eigen credits.

Ik laat ze trouwens zip,rar,tar etc. files uploaden en verwerk ik op de server.



@alcatrez: Mega upload progress bar... been there, done that.. Helaas is dat een popup venster en ik denk nu een iets mooiere oplossing te hebben. Daarnaast zat mijn CPU usage toen rond de 0.9 (!!) dus nee dank je. Wist je dat er ook een patch is voor php zodat je dit helemaal met php kunt doen? :p



@fricky: Het cgi script wordt wel uitgevoerd voordat de files helemaal geupload zijn. Hoe kan ik anders al de totale grootte berekenen? Geloof me, dit werkt, zie voorbeeld bovenaan. Pas als de totale grootte van de upload de door mij vooraf ingestelde grootte overschrijd, zal inderdaad eerst de totale file geupload worden voordat je een internal server error krijgt.



Ik draai overigen suPHP (een veiligere manier van php) en kan ik niet voor mijn eigen domein een grotere upload limit instellen, zonder daar een aparte php.ini voor te maken (don't ask). En ik wil ook niet dat alle domeinen op mijn server 50mb files kunnen uploaden. Daarnaast zit je bij php met een aantal andere, belangrijke velden zoals memory usage wat je dan ook zo groot moet zetten etc.

Grote file uploads met php is not-done, zonder dat je meteen een huge ammount of memory gebruikt etc. Het is in mijn ogen of CGI, of JAVA. Ik wil dus alles server side laten gebeuren, want er is momenteel nog geen cross-platform oplossing.

En ik houd niet van de java runtime engine, dus het zal geen java worden. Ik vind het namelijk nogal "makkelijk" om voor java te gaan, dit moet ook te maken zijn en dat vind ik nu juist de uitdaging ;)

Al met al denk ik dat sommigen van jullie onderschatten hoe lang ik hier al mee bezig ben.. Ik heb echt alle mogelijke manieren onderzocht (buiten java, dat wil ik gewoon niet) Ik denk nu een goede manier te hebben gevonden die werkt, alleen nog wat "beter" gemaakt zou kunnen worden.

  • flashin
  • Registratie: Augustus 2002
  • Laatst online: 17-12-2023
Mja als je het voor de uitdaging doet dan kies je misschien eerder voor CGI. Het was mij alleen niet duidelijk dat je dat zo wilde.

Onlogische keuze imho, maar misschien wel leuk om te doen ;)
Pagina: 1