Podstrčenie requestu namiesto odoslania formulára

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
spajdo
Člen | 7
+
0
-

Ahojte,
som úplný nováčik čo sa Nette týka a neviem ani čo mám hľadať tuna na fóre, tak rovno zakladám novú tému (sry).

Robim jednu aplikáciu v .NET a potrebujem z nej odoslať nejaké dáta (pár textov a dva súbory) na web server. Na web serveri mi beží php s nette. Najskôr som si pripravil serverovskú časť a to tak že som si urobil formulár do ktorého zadám požadované údaje (dva textboxy a dva filepickery a jedno tlačidlo na odoslanie formulára) a po odoslaní formulára sa dáta uložia na serveri v požadovanom tvare na základe zvolených parametrov. Všetko ide tak ako má.
Potom som si urobil v .NET-e metódu v ktorej si vyskladávam manuálne celý request s hlavičkou a celým telom tak ako si myslím že by to malo fungovať – lenže nefunguje.
Na serveri sa mi nenačítajú správne premenné. Neviete kde robím chybu?
Toto mám na serveri:

<?php
use Nette\Utils\Strings;

use Nette\DateTime;

use Nette\Diagnostics\Debugger;

use Nette\Application\UI\Form;

/**
 * Presenter, který zajišťuje výpis seznamů úkolů.
 */
class FilesPresenter extends BasePresenter
{

	/** @var HypoSync\PouzivateliaTable */
	private $userLists;

	protected function startup()
	{
		Debugger::enable(Debugger::DEBUG);
		//Debugger::enable(Debugger::PRODUCTION);
		parent::startup();
		$this->userLists = $this->context->userlists;
	}

	/** @var \Nette\Database\Table\ActiveRow */
	private $list;
	private $UserRow;
	private $JsonUser = array();

	public function actionDefault()
	{

	}


	protected function createComponentTaskForm()
	{
		$form = new Form($this, 'uploadForm');
		$form->addText('menoznalca', 'Meno znalca:');
		$form->addText('rok', 'Rok posudku');
		$form->addUpload('metadata', 'Metadáta:')
		->addRule(Form::MAX_FILE_SIZE, 'Maximální velikost obrázku 1 je 5 MB.', 5000 * 1024);
		$form->addUpload('posudok', 'Posudok:')
		->addRule(Form::MAX_FILE_SIZE, 'Maximální velikost obrázku 1 je 5 MB.', 5000 * 1024);
		$form->addSubmit('add', '1');
		$form->onSuccess[] = callback($this, 'AddPlaceFormSubmitted');

		return $form;
	}


	public function AddPlaceFormSubmitted(Nette\Application\UI\Form $form){
		$values = $form->getValues();

 		$menoznalca = $values["menoznalca"];
		$rokposudku = $values["rok"];

		$this->template->menoznalca = $menoznalca;

		$pathPosudok = $this->getDataDir($menoznalca, $rokposudku);
		$pathMetadata = $this->getDataDir($menoznalca);

		$posudok = $values["posudok"];
		$metadata = $values["metadata"];

		$this->template->pat = $pathPosudok;

  		if ($posudok->isOk()) {
			$name = $pathPosudok . $this->getWebalizeString($posudok->getName());
			$posudok->move($name);
		}

		if ($metadata->isOk()) {
			$name = $pathMetadata . $this->getWebalizeString($metadata->getName());
			$metadata->move($name);
		}

		$this->setView('successful');

	}



	public function actionUploadFile($subor)
	{
		$this->createComponentTaskForm();
	}


	public function renderDefault()
	{

	}

	public function renderUploadFile()
	{

	}


}

A takto vyzerá request ktorý som si vygeneroval z .NET-u

POST http://localhost/Sync_nette/www/files/uploadfile?do=uploadForm-submit HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:8.0.1) Gecko/20100101 Firefox/8.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: sk,cs;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
DNT: 1
Referer: http://localhost/Sync_nette/www/files/uploadfile
Content-Type: multipart/form-data; boundary=----------------------------8cf6943bdb06a12
Host: krajci
Content-Length: 366
Expect: 100-continue
Connection: Keep-Alive

----------------------------8cf6943bdb06a12
Content-Disposition: form-data; name="menoznalca"

Janko ľščťžýáíéúô
----------------------------8cf6943bdb06a12
Content-Disposition: form-data; name="rok"

2012
----------------------------8cf6943bdb06a12
Content-Disposition: form-data; name="add"

1
----------------------------8cf6943bdb06a12--

Lenže premenné $menoznalca a $rok sa mi na serveri nenaplnia. Neviete kde je problém?
Ak budete potrebovať ešte nejaké dodatočné informácie, tak dajte vedieť, rád poskytnem…

h4kuna
Backer | 740
+
0
-

Url requestu je jaké máš v něm parametr do? Zobraz všechny hodnot $_POST?

spajdo
Člen | 7
+
0
-

No toto je url ktorú volám

http://localhost/Sync_nette/www/files/uploadfile?do=uploadForm-submit

Vypísanie všetkých hodnôt skúsim, len teraz nie som pri projekte…

Editoval spajdo (26. 9. 2012 15:04)

spajdo
Člen | 7
+
0
-

No tak som to pozeral a keď dám vypísať premennú $_POST tak mi zobrazí – array(0) { }. Tak je niečo zlé s tým requestom? Viete mi prosím niekto poradiť?

Filip Procházka
Moderator | 4668
+
0
-

Wow.. To multipart/form-data je imho dost obskurdní na server-server komunikaci. Raději bych to posílal jako application/x-www-form-urlencoded.

spajdo
Člen | 7
+
0
-

No toto trochu zabralo… keď si dám teraz vypísať cez var_dump($_POST) a následne potom var_dump($values), tak mi vypísalo toto…

array(1) {
‚----------------------------8cf6aa623fa9b1e
Content-Disposition:_form-data;_name‘ =>
string(399) ""menoznalca"\r\n\r\nJanko ľščťžýáíéúô\r\n----------------------------8cf6aa623fa9b1e\r\nContent-Disposition: form-data; name=„rok“\r\n\r\n2012\r\n----------------------------8cf6aa623fa9b1e\r\nContent-Disposition: form-data; name=„add“\r\n\r\n1\r\n----------------------------8cf6aa623fa9b1e--\r\nContent-Disposition: form-data; name=„metadata“; filename=„test.7z“\r\nContent-Type: application/octet-stream\r\n\r\n7z'\034"
}
class Nette\ArrayHash#72 (4) {
public $menoznalca =>
string(0) ""
public $rok =>
string(0) ""
public $metadata =>
class Nette\Http\FileUpload#59 (5) {
private $name =>
NULL
private $type =>
NULL
private $size =>
NULL
private $tmpName =>
NULL
private $error =>
int(4)
}
public $posudok =>
class Nette\Http\FileUpload#65 (5) {
private $name =>
NULL
private $type =>
NULL
private $size =>
NULL
private $tmpName =>
NULL
private $error =>
int(4)
 }
}

Tak teraz tam tie dáta cez POST zrejme prídu, ale v ochytávaní toho formulára sa nevyplnia dané položky. Kde môže byť problém? A ďakujem za predošlé postrčenie.
No a práve som sa dozvedel, že nemôžem zmeniť ten Content-Type, pretože ja chcem posielať na server súbory a to cez url nepôjde. Takže musím nájsť problém niekde inde. Zrejme som ten request zle vygeneroval.

Editoval spajdo (27. 9. 2012 9:25)

h4kuna
Backer | 740
+
0
-

spajdo napsal(a):

http://localhost/Sync_nette/www/files/uploadfile?do=uploadForm-submit

Ahoj tak podle kódu co jsi zveřejnil toto není url na kterou by jsi měl posílat požadavek. V presenteru máš createComponentTaskForm, takže url bude

http://localhost/Sync_nette/www/files/uploadfile?do=taskForm-submit
Filip Procházka
Moderator | 4668
+
0
-

Samozřejmě, posílat data jako application/x-www-form-urlencoded neznamená jenom změnit hlavičku, ale doopravdy to posílat jako urlencoded.

spajdo
Člen | 7
+
0
-

a aké veľké súbory sa tak dajú posielať? aj 5MB alebo 10MB súbor takto pošlem? Koľko súborov naraz môžem takto poslať?

h4kuna
Backer | 740
+
0
-

spajdo napsal(a):

a aké veľké súbory sa tak dajú posielať?

to je ovlivněno upload-max-filesize default (2MB) a s tím souvisí post-max-size default (8MB)

aj 5MB alebo 10MB súbor takto pošlem? Koľko súborov naraz môžem takto poslať?

Počet souborů ovlivňuje max-file-uploads default (20)

Editoval h4kuna (27. 9. 2012 10:08)

Filip Procházka
Moderator | 4668
+
0
-

Ono stejně není z praktického hlediska dobré posílat zároveň 1000 souborů. Lepší je vždy dávkovat – když se to posere, nemusíš posílat vše znovu, ale jen tu jednu část.

No a taky by někdo mohl založit issue, aby Nette\Http umělo zpracovat multipart/form-data a rovnou i takovéto, když někdo posílá čistý JSON, nebo raw data POSTem.

Editoval HosipLan (27. 9. 2012 10:54)

spajdo
Člen | 7
+
0
-

No tak som zistil, že som mal problém v tom requeste a už som sa posunul o kúsok ďalej.
Content-Type mám nastavený stále na „multipart/form-data“ ale teraz sa mi už zobrazujú údaje vo $values… a to nasledovné

class Nette\ArrayHash#72 (4) {
public $menoznalca =>
string(28) „Janko ľščťžýáíéúô“
public $rok =>
string(4) „2012“
public $metadata =>
class Nette\Http\FileUpload#59 (5) {
private $name =>
NULL
private $type =>
NULL
private $size =>
NULL
private $tmpName =>
NULL
private $error =>
int(4)
}
public $posudok =>
class Nette\Http\FileUpload#65 (5) {
private $name =>
NULL
private $type =>
NULL
private $size =>
NULL
private $tmpName =>
NULL
private $error =>
int(4)
 }
}

Neviem prečo sa mi tie súbory nenaplnili…

Editoval spajdo (27. 9. 2012 10:22)

Filip Procházka
Moderator | 4668
+
0
-

Takže jsi měl, pravdu abstrakce už mě taky otupily, že ani neznám pořádně HTTP :) data se posílají jako multipart/form-data.

Zkus to nehackovat a použij nějakou hotovou knihovnu. Právě jsem to otestoval a funguje mi to, ikdyž to posílá jako multipart/form-data.

$ curl -v -X POST -F conf=@/home/hosiplan/.synergy.conf.tar.gz http://hosiplan.com/curl-test/post.php

> POST /curl-test/post.php HTTP/1.1
> User-Agent: curl/7.21.3 (x86_64-pc-linux-gnu) libcurl/7.21.3 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
> Host: hosiplan.com
> Accept: */*
> Content-Length: 423
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=----------------------------737ff6186543
>
< HTTP/1.1 100 Continue
< HTTP/1.1 200 OK
< Server: nginx/1.1.17
< Date: Thu, 27 Sep 2012 08:47:21 GMT
< Content-Type: text/html; charset=utf-8
< Transfer-Encoding: chunked
< Connection: close
< X-Powered-By: Nette Framework
< X-Frame-Options: SAMEORIGIN
<
array(0) {
}
array(1) {
  ["conf"]=>
  object(Nette\Http\FileUpload)#18 (5) {
    ["name":"Nette\Http\FileUpload":private]=>
    string(20) ".synergy.conf.tar.gz"
    ["type":"Nette\Http\FileUpload":private]=>
    NULL
    ["size":"Nette\Http\FileUpload":private]=>
    int(211)
    ["tmpName":"Nette\Http\FileUpload":private]=>
    string(14) "/tmp/phpRXndlo"
    ["error":"Nette\Http\FileUpload":private]=>
    int(0)
  }
}

Editoval HosipLan (27. 9. 2012 10:53)

spajdo
Člen | 7
+
0
-

Ďakujem za nápady a podnety. Už som aj ja vyriešil svoj problém. Problém bol nakoniec v tom vygenerovanom requeste. Som si všimol, že pred boundary je o dve pomlčky viac (v samotných dátach) ako v deklarácii Content-Typu. Tak keď som dal toto doporiadku, tak to už ide tak ako má. Ešte raz ďakujem za pomoc.