Podstrčenie requestu namiesto odoslania formulára
- spajdo
- Člen | 7
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…
- Filip Procházka
- Moderator | 4668
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
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
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
Samozřejmě, posílat data jako
application/x-www-form-urlencoded
neznamená jenom změnit
hlavičku, ale doopravdy to posílat jako urlencoded
.
- h4kuna
- Backer | 740
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
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 a rovnou
i takovéto, když někdo posílá čistý JSON, nebo raw data POSTem.multipart/form-data
Editoval HosipLan (27. 9. 2012 10:54)
- spajdo
- Člen | 7
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
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
Ď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.