ugrás a tartalomhoz

Stream alapú filefeltöltés

basswar · 2007. Szep. 21. (P), 15.19
Sziasztok!

Egy olyan kérdésem lene, hogy van-e lehetőség PHP-ben az ideiglenes könyvtárban való tárolás helyett direkten lementeni egy feltöltött file-t. Magyarul az elküldött HTTP form file-t tartalmazó mezőjét szeretném úgy elkapni, hogy azonnal lehessen egy fwrite-al lementeni, a move_uploaded_file, illetve bárminemű másolgatás, áthelyezgetés elkerülése végett.

Nem böngészővel, hanem egy Delphi-s klienssel küldöm az adatokat a szerveroldalnak, ami ezidáig tökéletesen működik is, csak ha nagyobb fileokkal és nagyobb mennyiségben fog menni a dolog, akkor kételkedem ennek a megoldásnak a hatékonyságában.

Ha tudtok valami megoldást, akkor nagyon megköszönném, bár végső esetben írok egy Apache modult, ami megcsinálja.

Előre is köszi: Alex
 
1

inod átírása

Szekeres Gergő · 2007. Szep. 21. (P), 16.54
nem tudok ilyet, de linux parancsot tudsz phpban kiadni, és van egy utasítás ami csak az inodban írja át a file elérését. ez jóval gyorsabb, mintha fizikálisan átmásolná a filet. a parancsra már nem emlékszem, de sztem ha rákeresel megtalálod.
2

Nem lehet

janoszen · 2007. Szep. 21. (P), 19.58
PHP-ból nem férsz hozzá feltöltés közben a streamhez, csak olyan nyelvből mint például a Perl.
3

Na, nem baj ... :-(

basswar · 2007. Szep. 21. (P), 22.33
Köszi mindkettőtöknek, sajnos gondoltam, hogy ez lesz, mivel nem sok esélyt láttam én sem arra, hogy a feltöltött file-t a PHP előtt elkapjam a webszervertől. Akkor marad az Apache modul, mert Windows-on is mennie kell, ráadásul gyorsan, így aztán Delphi/Kylix párossal cross-platform-ra meg tudom csinálni, natív kóddal.

Üdv:Alex :-)
4

ftp

zila · 2007. Szep. 22. (Szo), 09.49
Az ftp mintha pont erre szolgálna...

Miért kell feltétlenül http-n feltöltened a fileokat?
5

Autentikáció miatt

basswar · 2007. Szep. 22. (Szo), 10.02
Azért mert az FTP-s autentikáció miatt igen lassú tud lenni sok helyen, nameg ez egy web alapú filemanager, csak Delphi-ben elkészítve és olyan helyeken is mennie kell, ahol semmi FTP nincsen. Letöltik, oszt' megy. :-) Ennyi.

Üdv:Alex
6

és a modul?

zila · 2007. Szep. 22. (Szo), 10.14
Letöltik, oszt' megy. :-) Ennyi.

Mármint megy, ha az apache modul telepítve van :)
7

Megoldva

basswar · 2007. Szep. 22. (Szo), 10.28
Igen, ez mégegy probléma, de saját szervereken lesz nagyrészt.

De azóta megoldódott a probléma, mostmár bármilyen szerveren menni fog. Kikerültem a standard file-feltöltési mechanizmust. A feltöltéskor nem file-ként adom hozzá a feltöltendő file-t, hanem bekódolom base64-el stringgé és sima formfield-ként adom hozzá a form-hoz. Ezután POST és szerveroldalon meg is kapom gyönyörűen egy base64_decode($_POST[...]) hívással, amit már csak fwrite-al kinyomok a filerendszerbe. Ezzel meg is oldódott a dolog, mert nincs ideiglenes tárolás, hanem közvetlenül stringstream-ként kapom a file tartalmát, elkerülve a felesleges - ideiglenes helyen történő - duplikált adattárolást és az áthelyezés overhead-jét. Köszönöm mindenkinek a segítőkészséget!!

Üdv:Alex :-)
8

jó ötlet :)

zila · 2007. Szep. 22. (Szo), 11.35
Tetszik az ötlet, bár kicsit a kerék újrafeltalásának érzem, hiszen van webdav modul is, ami ilyen file műveletkre való, ráadásul az hálózati drive-ként mappelhető akár így akár egy total commanderrel lehet webszerveren matatni...

A post_max_size php.ini (ha php van szerver oldalon) valamint az apache LimitRequestBody beállításra kell figyelni.
9

Egy kis pótlás

basswar · 2007. Szep. 22. (Szo), 12.15
Na igen, ez sem lenne rossz, de nekem sajna nagyon különleges funkciók kellenek, mert a szerveroldali modul szolgáltatásaira egy teljes Delphi-s adathalmaz komponenscsaládot fejlesztettem, ami ezekután akármilyen adatfüggő kontrollhoz hozzárendelhető, illetve rengeteget kell mellette FireBird adatbázisban is dolgozni, mégpedig ugyanabból a szoftverből, ezért is kell saját megoldás. Nameg persze nem titkoltan egy olyan dolgot is csinál, hogy az FTP-vel ellentétben - bár létezik rá néhány megvalósítás - a felhasználó fiókjának teljes könyvtárstruktúráját visszadja belépéskor egy rekurzív függvénnyel és így qrva jól lehet a könyvtárhierarchiában mászkálni, mivel egyben látja az egészet egy TreeView-ban. Ehhez kliensoldalon egy nagyon jól felépített GUI tartozik, ha kész lesz teljesen, még lehet, hogy közkincsé is teszem, mert tényleg szuperül működik.

Minden jót a nektek:Alex :-)
10

(Fast)CGI

janoszen · 2007. Szep. 22. (Szo), 15.39
Na, van egy gyönyörű megoldás erre a problémára. (Fast)CGI módban kell futtatni a PHP-t és ha fel kell tölteni, akkor úgy kell beállítani, hogy először mondjuk egy Perl scriptet lökjön meg, aztán majd valamikor az hívja meg a PHP-t ha egyáltalán szükség van rá. Ergo csak a feltöltés legyen megoldva Perlből.

Pont kint van egy cikk a nyitólapon, az valószínűleg segítségedre lesz.
11

Örök hálám ...

basswar · 2007. Szep. 22. (Szo), 15.59
Nagggyon köszönöm!!! Kipróbálom ezt is!!!

Üdv:Alex :-)
12

CGI vagy Rewrite

vbence · 2007. Szep. 22. (Szo), 16.22
Cgi módú PHP megkapja standard inputként a POST tartalmát. Ez a "PERL kell hozzá" dolog nem tudom honnan terjedt el (talán, hogy a PERL mindig cgi?), de nyilvánvalóan téves nézet.

Másik lehetőség, ha saját kliens van, hogy nem POST metódust használsz, hanem valami más fantázianevet pl ASDF. A szerveren egy RewriteRule átirányít a PHP szkriptedre, ami szintén standard inputon eléri a POST tartalmát (ehhez már nem kell CGI).
13

PHP 5.2 File upload hook

Hodicska Gergely · 2007. Szep. 23. (V), 16.53
5.2-es verziótól kezdve van lehetőség file upload hookot írni. Másik megoldás lehet például, hogy xinetd-vel tolod bele egy PHP scriptbe a feltöltött fájlt, ilyenkor PHP-ból tudod stdinről olvasni a fájlt, és oda teszed, ahová csak szeretnéd.


Üdv,
Felhő
14

Köszi mindenkinek

basswar · 2007. Szep. 23. (V), 20.03
Köszönöm mindenkinek a kedves segítségét, úgy néz ki, maradok a sima POST metódusnál és a base64-es enkódolós feltöltésnél. Ez nagyon bevált és nem igényel semmi extrát szerveroldalon, így végülis oprendszer-, illetve webszerverfüggetlen lett a dolog, ja és nagyon egyszerűen megy, mivel semmi más nem kell neki szerveroldalon, mint az általam készített kb 100 soros modul. Szerencsére így ki lett kerülve az áthelyezősdi, nincs felesleges lemezművelet, hordozható és egyszerű. Nameg gyors. A Delphi-s kliens remekül együttműködik a szerveroldallal, gyönyörűen mennek a progressbar-ok fel-és letöltésnél egyaránt. Végülis igaz, hogy saját szerverekhez kell vállalati megoldásnak, de a hordozhatóságot és egyszerűséget azért is tartom nagyon szem előtt, mert ha kész lesz, akkor tényleg szeretném közzé tenni, hátha használhatónak találják mások is.

Üdv:Alex :-)