ugrás a tartalomhoz

Ajax file upload, a file teljes merete feltoltes kozben

Barkóczi Roland · 2006. Ápr. 18. (K), 09.56
Sziasztok,

http://www.devpro.it/upload_progress/ oldalon talalhato upload progresst hasznaltam fel az oldalamon, illetve szabtam testre.
Ez egy nagyon jo kis eszkoz, de van egy hibaja: nem tudja szazalekosan kiirni a feltoltes folyamatat, annyit tud csak, hogy kiirja, hany kB toltodott fel a filebol.

Tobb ilyen upload manager forrasat megneztem, de sehogy sem tudtam rajonni arra, hogy pl. a Megaupload (http://www.raditha.com/megaupload/) honnan veszi a feltoltott file vegleges meretet.

Szoval ket oldalrol probaltam megkozeliteni a dolgot:
- a feltoltott file meretet szerveroldalon szerzem meg: az vele a baj, hogy a feltoltes alatt a tmp konyvtarban levo file meretét tudom lekerdezni, a véglegeset nem, illetve nem tudom, hogy hogyan lehetne megtudni a feltoltes kozben a vegleges meretet. Szerintem sehogy.
- a klienssel allapitom meg a feltoltott file meretét: IE ben letezik egy javascript osztaly, amivel helyi fileokat lehet kezelni, de ez FF alatt nem all rendelkezesre. Ha van egy <input type='file'> elemem, akkor a kivalosztott file meretét meg lehet tudni valahonnan?

Szoval, szerintetek hogy lehet megallapitani a feltoltott file teljes meretet _feltoltes kozben_? (tehat nem a feltoltes vegen, a $_FILES tombbol!)
 
1

ja, es a forras

Barkóczi Roland · 2006. Ápr. 18. (K), 10.04
ja es a forras:
www.aer.hu/filemanager/aerFM.zip
2

csak 1 tipp

Anonymous · 2006. Május. 4. (Cs), 22.15
Mivel tudod hogy mennyi a file teljes merete, meg hogy mennyi ment mar fel('kiirja'), egy osztas muvelettel el lehet erni a % -os megjelenitest is
6

Nem tudod

Bártházi András · 2006. Jún. 11. (V), 15.52
Sem a fájl teljes méretét, sem azt nem tudod, hogy mennyi ment már fel... Ezt csak akkor tudod már, amikor minden feltöltésre került.
8

Content-Length header

Hodicska Gergely · 2006. Jún. 11. (V), 16.44
Ezt alap esetben kitölti a böngésző. Ebből ki lehet bűvészkedni a fájl méretét is. Le kell vonni a multipart részen belüli fejlécek méretét, és akkor vagy nagyon pontos, vagy teljesen pontos méretet lehet kapni.


Felhő
10

Második mondat

Bártházi András · 2006. Jún. 12. (H), 08.11
Olvasd el a második mondatomat. Amikor bármit le szeretnél kérdezni, akkor már mindegy. Kitölti a böngésző, megkapsz sokmindent, de csak akkor, amikor már mindegy, mert fenn van a teljes fájl.
13

7. hozzászólás ;)

Hodicska Gergely · 2006. Jún. 14. (Sze), 00.00
Felhő
14

Thread

Bártházi András · 2006. Jún. 14. (Sze), 07.36
Ennek örülök, de ebben a szálban szó sem esett arról, hogy a PHP motort módosítani kell. A 7. hozzászólásnál volt ilyen. A motor módosítása nélkül nem lehet ilyet csinálni, a motor módosításával meg lehet. Sokaknak ez nem lehetőség.
15

továbbra is 7. hozzászólás...

Hodicska Gergely · 2006. Jún. 14. (Sze), 13.15
A motor módosítása nélkül nem lehet ilyet csinálni

...utolsó sok sor.


Felhő
3

file merete feltoltes kozben ... ecceru mint a pofon

csikosjanos · 2006. Jún. 11. (V), 14.02
A problemara a valaszt nem a php-ban, hanem egyeb mas nyelvben kell keresni. A Megaupload ezt a PERL-ben realizalta.

Ha esetleg valaki tudna tisztan php-s megoldast, arrol szivesen hallanek.
9

Nem lehet...

janoszen · 2006. Jún. 11. (V), 16.53
Nem lehet, mert a PHP csak a feltöltés után indul be és nem ad hozzáférészt közvetlenül a feltöltött PHP adatokhoz. Gyk csak a feltöltött adatokat kapod meg.
16

tmp konyvtar figyelese

csikosjanos · 2006. Júl. 12. (Sze), 14.12
itt elsosorban arra gondoltam, hogy feltoltes pillanataban esetleg meg lehet-e tudni a tmpfile nevet es egy frameben esetleg ennek a meretet ellenorizni. Valoszinuleg nem. De hatha tud valaki megis erre valamit.
17

2 megoldás

vbence · 2006. Júl. 12. (Sze), 18.25
Nemrég megírtam 2 megoldást (PHP) a problémára.. ha lesz dőm, majd írok róla egy cikket.

Amúgy amit perlben lehet azt phpben is...
4

Fura

vbence · 2006. Jún. 11. (V), 15.09
Pont a napokban gondoltam rá, hogy csinálok egy javás megoldást errea dologra. Valószínűleg meg is csinálom.

Amit nem értek: egyszerre mondjuk van 10 feltöltés folyamatban. Honnan lehet tudni, hogy melyiknek az adatait szeretnénk látni?

A filemérett nem próbáltam ki, de mi lenne, ha a directory információ helyett megnyitnád a filet, a végére seekelnél, majd kiolvasnád az aktuális pozíciót (elméletben).
5

PHP-ból nem megy...

Bártházi András · 2006. Jún. 11. (V), 15.51
Mivel PHP-ben az első utasítás lefutásakor már feltöltődött az összes feltöltendő fájl, ezért PHP-ben nem lehet megoldani a feltöltés folyamatának monitorozását. Azoknál a nyelveknél lehet, amelyek nem maguk kezelik le a feltöltést - például a Perl ilyen.
7

létezik ott is megoldás

Hodicska Gergely · 2006. Jún. 11. (V), 16.39
Van egy AJAX File Upload Meter nevű cucc, ami az itt található patch-re épül.

Ezenkívül pl. az is megoldás lehet, hogy a file feltöltés egy külön formban történik, aminek a célja lehet pl. egy olyan port, ami mögött mondjuk egy xinetd figyel, és átpasszolja az adatokat egy PHP-nak. Ez meg szépen a standard inputról olvassa a küldött adatokat, és szépen írja ki a fájlt, és akár közben lehet tőle kérdezgetni, hogy mennyi ment fel eddig.


Felhő
11

csakhogy nem eppen jo.

Barkóczi Roland · 2006. Jún. 12. (H), 10.31
Ezt a megoldast neztem (alaposan korulneztem a neten e temaban) de ehhez magat a PHP ertelmezot patcheli meg, ha jol ertettem, amire nekem nincs modom, mert lehetoleg egy szerverfuggetlen kodot szerettem volna irni.

Szoval szerveroldalon nem lehet sajnos.

De mi a helyzet a kliensoldalon? Amikor kivalsztok egy file-t, nem lehet valahogy lekerdezni annak a meretét?

Egyebkent: a tmp/upload konyvtar melw estekben kerul torlesre? Mert azt vettem eszre, hogy sokszor bent marad a feltoltott file feltoltes utan is.
12

neked kéne törölni

vbence · 2006. Jún. 12. (H), 13.47
A php dokumentációban a move_uploaded_file funkció szerepel, szóval a törlés te dolgod.

Amúgy a másolás+törlést megoldást ajánlom a feltöltött fájlokra (persze az is_uploaded_file -al együtt). A move ugyanis nem működik különböző partíciók között, és a temp könyvtár valószínűleg máshol van, mint a webes fájlok.

B
18

upload progress manager

Anonymous · 2006. Okt. 8. (V), 16.26
Sziasztok!

A fent említett devpro modulból és másokból összegyúrtam egy upload managert. Nem kell hozzá php patch, viszont egy getfilesize.cgi nevű kis fájlocskát el kell helyezni a cgi-bin -ben. Van benne egy minta index.php, valamint telepítési instrukciók.

Ime a blogbejegyzés
19

Bocs

Anonymous · 2006. Okt. 9. (H), 20.13
Na, akkor itt kérek elnézést az előbbi blogbejegyzésért. Megállapodás miatt nem adhatok ki a témával kapcsolatos kódot, de a diskurálás senkinek sincs megtiltva.

Szóval a devpro modul nagyon jó kis eszköz, sajnos egyszerre több feltöltésnél össze tud zavarodni a tempfájlok között (szerintem ez még javítható), de az ötlet kiváló.

Amire ehhez még szükség van, az a fájlméret. Kliensből nem lehet megállapítani, el kell tehát posztolni szerveroldalra. php-nak nem adhatod, mert az nem indul el a feltöltés befejezéséig. (Nekem nincs módom patchelni - a hordozhatóság ezzel gyak. megszűnik.) Itt lép be egyébként a képbe a devpro spiritusza: külön szálban kikeresi a feltöltődő tempfájlt, s lekérdezi a méretét. Csak sajnos abból nem tudja meg, mekkora a célméret. Ez a maximum tehát, amit php-ból ki lehet hozni.).

Marad a perl. Nekem annyira tetszett a devpro, hogy azt használtam, és csak annyi cgi-beavatkozást akartam, amennyi feltétlenül szükséges: getfilesize.cgi vagy valami ilyesmi. Az elv az, hogy elposztolom neki a fájlt, várok az arany info-ra, megkapom, leállítom a posztot, s elindítom a devpro-s feltöltést immár a szükséges adat birtokában.

Egy sor perl kód: $len = $ENV{'CONTENT_LENGTH'};

Ennyi.

Ha valaki új a perlben (én is az voltam), böngéssze, vágja meg, szabja testre a megaupload szkriptjeit, meg fogja találni a releváns részt.


Kis összegzés:

- php patch:
-------------
előny: egyszerre több feltöltéssel nincs gond, és nincs cgi :)
hátrány: hack, megszűnik a kód hordozhatósága

- megaupload és tsai:
---------------------
előny: több feltöltést stabilan kezel, semmi hack.
hátrány: a feltöltés kezelését átveszi a cgi, általában túl sokat vesz ki a php kezéből.



- hibrid
--------
előnyök: A kód hordozható. Elegáns, hogy a cgi minimális szinten van segítségül hívva. A feltöltés teljesen php alapon marad, php action-nel. Az ajaxos progress visszajelzés csak plusz rétegként van jelen, működési zavarok esetén a feltöltés akkor is rendben végbemegy.

hátrány: amellett, hogy a devpro-megoldás azért egy kicsit hack (azért messze nem annyira mint egy php patch), több feltöltés esetén nem is túl stabil. Viszont szerencsére a probléma szigorúan csak a progress visszajelzésre korlátozódik, a feltöltés marad ugyanolyan stabil, mint egy szokványos php feltöltés.