PHP script - upload

 ( waxy | 2018. szeptember 13., csütörtök - 14:51 )

Sziasztok,

Szeretnék feltölteni egy tartalmat egy URL-re.

Mintapélda:

"<"form name=fileuploadexample method=post enctype=multipart/form-data action=teszt11.php">"
   "<"input type=hidden name=MAX_FILE_SIZE value=30000">"
   "<"input type=file name=stdin accept=.dossie, .es3">"
   "<"input type=submit name=submit value=Küldés class=occszbtn">"
"<"/form">"

A fogadó oldal kész és a fenti példával fel is tudom küldeni a fáljt.

Kérdésem:
Szeretném ha nem a felhasználó által felküldött fájl kerülne post-olásra, hanem egy előzőleg előállított tartalom. Azt gondolom, hogy a file_get_contents függvénnyel meg tudom oldani, de fogalmam nincs hogyan állítsam elő context-et. Jó volna egy dump, amivel látnám a mit küld el a fenti megoldás. De ha létezik más, elegánsabb megoldás, arra is vevő lennék.
Valami ilyesmire gondoltam:
https://stackoverflow.com/questions/12939156/submit-form-on-one-server-process-it-and-then-post-results-to-another-domain

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Nem teljesen vilagos, hogy mit akarsz. Van egy servered, amire fel akarsz tolteni egy file-t egy masik gepen futo, PHP-ban megirt kliensbol? Akkor a megadott HTML kodot senki sem ertelmezi, mert az a PHP-s kliensed nem egy bongeszo. Ha ezzel kompatibilis inputot varsz a server oldalon, akkor meg ugy ird meg a PHP-s kliensedet, hogy az legyen! Pl. egy megfeleloen felparameterezett curl hivassal.

Pl. reszletek egy valami hasonlo kliens oldali PHP kodbol, ami egy kepet tolt fel egy (asszem railses) gepre:

$curl_options=array //altalanos beallitasok, en utana ujrahasznositom azt a kapcsolatot (kb. vegtelen ciklusban figyel egy konyvtarat ebben a modban, es feltolti)
(
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HEADER => false,
CURLOPT_HTTPGET => false,
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => array(),
CURLOPT_URL => 'http://example/whatever.php',
CURLOPT_COOKIEFILE => "./cookiefile", //ha kell
CURLOPT_USERAGENT => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
CURLOPT_FORBID_REUSE => false,
);

$ch=curl_init();
curl_setopt_array($ch,$curl_options);
curl_setopt($ch,CURLOPT_URL,$URL); // igy tudod atallitani a defaultokat..
//curl_setopt($ch,CURLOPT_HTTPHEADER,array_merge(array("Content-Type:multipart/form-data"),getauth())); // ez neked lehet, hogy nem kell, nekem plusz azonositas kellett a http headerbe, hogy mi ez
$filedata=file_get_contents($postthis); // itt eloszedem a $postthis nevu file-t, ezt te elvileg on-the-fly generalod
curl_setopt($ch,CURLOPT_POSTFIELDS,array("file" => $filedata, "filename" => $postthis)); // nekem file volt a field neve, neked gondolom stdin lesz, ill. a tobbi postolando valtozot is meg kell adnod, ha lesz meg input mezo a kesobbiekben
curl_setopt($ch,CURLOPT_INFILESIZE,sizeof($filedata)); // ertelemszeru
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$result=curl_exec($ch); // itt kerul tenylegesen feltoltesre

if(!curl_errno($ch)) // ha az errno nem jelzett hibat, es a 200 OK a statusz, akkor minden jo, ha nem, akkor szolok a usernek.. command line eszkoz, ugyhogy kiirom neki, nalad lehet, hogy maskepp fog menni.. utana en ujrainicializalom a $ch-t, mert jon a kovetkezo foto.. neked az lehet, hogy nem kell
{
$info=curl_getinfo($ch);
if(array_key_exists('http_code',$info) && $info['http_code']==200)
{
$ok=1;
}
else
{
echo "gebasz\n";
var_export($info);
curl_close($ch);
$ch=curl_init();
$ok=0;
}
}
else
{
$errmsg = curl_error($ch);
curl_close($ch);
$ch=curl_init();
$ok=0;
}

A php.ini-t meg majd nezd at, lehet, hogy tiltva van a curl (esetleg fel sincs teve a csomag), nincs kiengedve tuzfalon, stb..

--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin

Éreztem, hogy nem voltam pontos.
Szóval van két különböző szerver és az egyikről a másikra küldeném az adatokat.
Php script: Kitöltök egy űrlapot, submit, meghívok egy másik scriptet(1) - az előállítja az adatokat, submit, meghívok egy másik scriptet(2) - (na itt tartok most) ez a script átküldené az adatokat a másik szervernek.
Jelenleg, ha a script(2) lementi fájlba az adatokat, akkor kézzel át tudom küldeni a fájlt a fenti minta segítségével. A fogadó oldal POST felküldésben vár egy fájlt melynek a paramétere stdin.
A curl-os megoldást megnézem, jónak tűnik elsőre. Köszönöm

Ezt fejtsd ki jobban, mert nem követhető amit írsz:

"Php script: Kitöltök egy űrlapot, submit, meghívok egy másik scriptet(1) - az előállítja az adatokat, submit, meghívok egy másik scriptet(2) - (na itt tartok most) ez a script átküldené az adatokat a másik szervernek."

Van egy szervered, pl. domain1.com, rajta egy html form, kitöltöd, és annak az action-jének domain2.com-on levő php fájlt adsz meg, átmegy oda, domain2.com php-je legenerál a kapott adatokból egy másik form-ot? Itt beírsz adatokat megint, és vissza akarsz menni vele a domain1.com-ra?

Ahogy a kolléga is írta, a php nem fog neked html form-ot értelmezni, a curl való arra, hogy post-olást csinálj, de megoldhatod az egészet úgy is, hogy domain1.com-on levő php meghívja a file_get_contents("https://domain2.com/valami/valami2/...") függvényt, így is küldhetsz át adatot a domain2-nek, ami meg szintén file_get_contents-el le tud tölteni domain1 által elkészített adatokat, akár konkrét fájlt is. Biztonsági kérdésekre érdemes lenne gondolnod, file_get_contents nem épp biztonságos https esetén sem, fájl letölthetősége előtt autentikálni kéne, hogy ne akárki férjen hozzá az adatokhoz, ...

Javaslom dobd fel az egész problémát, amit meg szeretnél oldalni, mert az is lehet, hogy azért nem értjük egymást, mert nem is így érdemes megoldani hasonló problémákat.

Orulok, hogy segitett, de tovabbra sem vilagos mi a felallasod.
Egyebkent az urlapos gep is a tied, es ahhoz is hozzafersz? Mert lehet, hogy kitalalhatsz valami esszerubb kommunikaciot is.

--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin

Igen, az űrlapos is az enyém. Akkor nevezzük ezt domain1.com-nak. Ezen történik az adatgyűjtés, XML előállítása, majd becsomagolása egy e-aktába. Ezt az e-aktát kell továbbítani a domain2.com-ra. Ez már kívül esik a hatáskörömön.

A specifikációban ez áll:
"Beküldés közvetlen HTTP kapcsolaton keresztül
Az e-aktát HTTP protokollon keresztül lehet beküldeni a melléklet 3. pontjában meghivatkozott URL- re.
A HTTP kérést felhasználónévvel és jelszóval hitelesítve kell elküldeni (HTTP basic authentication). (A felhasználónév/jelszó páros nem kerül be ebbe a dokumentációba.)
Az e-aktát HTTP POST kérésben kell elküldeni. A kérés tartalmának MIME típusa multipart/form-data kell, hogy legyen. Az e-akta tartalmát az „stdin” nevű paraméterben kell feltölteni."

Azt gondolom, hogy a curl erre tökéletesen meg fog felelni. Ha lesz időm, ki is próbálom.
Köszönöm a segítséget

https://ceginformaciosszolgalat.kormany.hu/download/b/5f/32000/Specifikacio_automatikus_bejegyzes.pdf

Lehet, hogy hamarabb kapsz segitseget ha maskor belinkeled a nyilvanosan elerheto specifikaciot :)

---------------------------------------------
Support Slackware: https://paypal.me/volkerdi

+ nagyon sok :)

Igen, ezzel egy kicsit egyszerubb lett volna.. bar az .es3-bol gyanus volt.
Raadasul a hibakat is szepen dokumentalja, amire reverse engineeringgel nem tudnal rendesen felkeszulni.

--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin

+1 :)

LIKE :)