Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][Web Forms 2] Ucinanie danych POST
Wykladowca
post
Post #1





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 19.04.2006

Ostrzeżenie: (0%)
-----


Witam!

Eksperymentowałem sobie z Web Forms 2, próbująć napisać skrypt do wczytywania wielu plików z jednego pola <input>. Problem pojawił się przy interpretacji XML wysłanego przez przeglądarkę. Przy wybraniu więcej niż 1 pliku, tag zamykający XML jest przycinany.

Miałem kłopot z wybraniem odpowiedniego forum, nie wiedząc czy winna jest przeglądarka czy php. Obecnie niestety WF2 obsługuje tylko Opera, więc nie mogłem sprawdzić w innych klientach. (w wersji 9.63 i 10.00 alpha jest ten sam błąd)

Wersja php: 5.2.6-2ubuntu4

Formularz:
  1. <form action="/actions/uploadtotemp.php" method="post" enctype="application/x-www-form+xml">
  2. <p>
  3. <label><input type="file" name="strips" max="20">Maks. 20 plików</label>
  4. <input type="submit" value="Wyślij">
  5. </p>
  6. </form>

Skrypt
  1. <?php
  2. header('Content-type: text/plain;charset=utf-8');
  3. $input = fopen("php://input", "w");
  4. echo stream_get_contents($input);
  5. ?>


Wyjście skryptu (pliki są takie same, więc wyciąłem pięć ostatnich)
  1. <submission xmlns="uuid:d10e4fd6-2c01-49e8-8f9d-0ab964387e32">
  2. <file name="strips" index="0" filename="1.png">
  3. iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAABmJLR0QA/wD/AP+g
  4. vaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1wMNEDIzOKOyLQAAAIVJ
  5. REFUCNclyUEKwyAQQNGvDiS4Cr1CAu3ZcoAesotcpI2CTYiKOF30bZ9Z16eKCDFG
  6. tu1FrZlx9EgIH6wVzvPLdZ2UcmGMQUIIAJRSaK3RewdA9v1N751hGFiWB9ZanHP/
  7. AJimG/N8x3tPzhmpNQNQaybGneNItNYQAFVFVUkp4ZxDVfkBuvlIywij5BoAAAAA
  8. SUVORK5CYII=
  9. </file>
  10. <file name="strips" index="0" filename="2.png">
  11. plik
  12. </file>
  13. <file name="strips" index="0" filename="3.png">
  14. plik
  15. </file>
  16. <file name="strips" index="0" filename="4.png">
  17. plik
  18. </file>
  19. <file name="strips" index="0" filename="5.png">
  20. plik
  21. </file>
  22. <file name="strips" index="0" filename="6.png">
  23. plik
  24. </file>
  25. </s

Jak widać tag </submission> jest ucięty.

Wysłałem też formularz do netcata, oto "gołe" żądanie POST
Kod
POST / HTTP/1.1
User-Agent: Opera/9.63 (X11; Linux i686; U; en) Presto/2.1.1
Host: localhost:5000
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: pl-PL,pl;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Referer: http://v2.localhost/pages/upload.php
Connection: Keep-Alive
Content-Length: 2517
Content-Type: application/x-www-form+xml; charset=utf-8

<submission xmlns="uuid:d10e4fd6-2c01-49e8-8f9d-0ab964387e32">
<field name="id" index="0">0</field>
<file name="strips" index="0" filename="1.png">
iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAABmJLR0QA/wD/AP+g
vaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1wMNEDIzOKOyLQAAAIVJ
REFUCNclyUEKwyAQQNGvDiS4Cr1CAu3ZcoAesotcpI2CTYiKOF30bZ9Z16eKCDFG
tu1FrZlx9EgIH6wVzvPLdZ2UcmGMQUIIAJRSaK3RewdA9v1N751hGFiWB9ZanHP/
AJimG/N8x3tPzhmpNQNQaybGneNItNYQAFVFVUkp4ZxDVfkBuvlIywij5BoAAAAA
SUVORK5CYII=
</file>
<file name="strips" index="0" filename="2.png">
iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAABmJLR0QA/wD/AP+g
vaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1wMNEDIzOKOyLQAAAIVJ
REFUCNclyUEKwyAQQNGvDiS4Cr1CAu3ZcoAesotcpI2CTYiKOF30bZ9Z16eKCDFG
tu1FrZlx9EgIH6wVzvPLdZ2UcmGMQUIIAJRSaK3RewdA9v1N751hGFiWB9ZanHP/
AJimG/N8x3tPzhmpNQNQaybGneNItNYQAFVFVUkp4ZxDVfkBuvlIywij5BoAAAAA
SUVORK5CYII=
</file>
<file name="strips" index="0" filename="3.png">
iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAABmJLR0QA/wD/AP+g
vaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1wMNEDIzOKOyLQAAAIVJ
REFUCNclyUEKwyAQQNGvDiS4Cr1CAu3ZcoAesotcpI2CTYiKOF30bZ9Z16eKCDFG
tu1FrZlx9EgIH6wVzvPLdZ2UcmGMQUIIAJRSaK3RewdA9v1N751hGFiWB9ZanHP/
AJimG/N8x3tPzhmpNQNQaybGneNItNYQAFVFVUkp4ZxDVfkBuvlIywij5BoAAAAA
SUVORK5CYII=
</file>
<file name="strips" index="0" filename="4.png">
iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAABmJLR0QA/wD/AP+g
vaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1wMNEDIzOKOyLQAAAIVJ
REFUCNclyUEKwyAQQNGvDiS4Cr1CAu3ZcoAesotcpI2CTYiKOF30bZ9Z16eKCDFG
tu1FrZlx9EgIH6wVzvPLdZ2UcmGMQUIIAJRSaK3RewdA9v1N751hGFiWB9ZanHP/
AJimG/N8x3tPzhmpNQNQaybGneNItNYQAFVFVUkp4ZxDVfkBuvlIywij5BoAAAAA
SUVORK5CYII=
</file>
<file name="strips" index="0" filename="5.png">
iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAABmJLR0QA/wD/AP+g
vaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1wMNEDIzOKOyLQAAAIVJ
REFUCNclyUEKwyAQQNGvDiS4Cr1CAu3ZcoAesotcpI2CTYiKOF30bZ9Z16eKCDFG
tu1FrZlx9EgIH6wVzvPLdZ2UcmGMQUIIAJRSaK3RewdA9v1N751hGFiWB9ZanHP/
AJimG/N8x3tPzhmpNQNQaybGneNItNYQAFVFVUkp4ZxDVfkBuvlIywij5BoAAAAA
SUVORK5CYII=
</file>
<file name="strips" index="0" filename="6.png">
iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAABmJLR0QA/wD/AP+g
vaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1wMNEDIzOKOyLQAAAIVJ
REFUCNclyUEKwyAQQNGvDiS4Cr1CAu3ZcoAesotcpI2CTYiKOF30bZ9Z16eKCDFG
tu1FrZlx9EgIH6wVzvPLdZ2UcmGMQUIIAJRSaK3RewdA9v1N751hGFiWB9ZanHP/
AJimG/N8x3tPzhmpNQNQaybGneNItNYQAFVFVUkp4ZxDVfkBuvlIywij5BoAAAAA
SUVORK5CYII=
</file>
</submission>


Sądzę, że ma to jakiś związek z Content-length, jednak nie wiem która strona jest winna. Porównując długość danych w gedit z wartością w nagłówku, ta druga wydaje się wręcz za duża. (nie wiem czy gedit nie przekręca kodowania czy coś)

Ten post edytował Wykladowca 18.01.2009, 15:56:26
Go to the top of the page
+Quote Post
pinochet
post
Post #2





Grupa: Zarejestrowani
Postów: 120
Pomógł: 12
Dołączył: 9.10.2008
Skąd: Tricity.Rumia()

Ostrzeżenie: (0%)
-----


1. Porównując długość w notepad++ jest 2527
a w content 2517 sekwencja "ubmission>" ma 10 brakujących znaków.

2. nie wiem co to za typ: "application/x-www-form+xml" ale:
Cytat
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
...
Content-Type: application/x-www-form+xml; charset=utf-8
Go to the top of the page
+Quote Post
Wykladowca
post
Post #3





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 19.04.2006

Ostrzeżenie: (0%)
-----


Jest to typ MIME służący do wysyłania XForms, a przez to też ich okrojonej wersji Web Forms 2
http://www.w3.org/TR/web-forms-2/#x-www-form-xml
Dane post są wysyłane z przeglądarki do serwera, więc czy taki typ akceptuje przeglądarka nie ma tu znaczenia.

Cóż, pozostaje wysłać raport o bugu do Opery. Rodzi się nowe pytanie: jak przekonać php by zignorowało Content-length? Bo wątpie żeby naprawili tego buga w stabilnych wydaniach na dniach. Wujek Google nie chciał mi podpowiedzieć...
Go to the top of the page
+Quote Post
pinochet
post
Post #4





Grupa: Zarejestrowani
Postów: 120
Pomógł: 12
Dołączył: 9.10.2008
Skąd: Tricity.Rumia()

Ostrzeżenie: (0%)
-----


Wydaje mi się, że raczej php tu nic nie zdziała, wydaje mi się że za odbieranie danych od klienta odpowiedzialny jest server (Apache etc. )
BTW: Do FF i Mozilli jest wtyczka "Mozilla XForms".
Go to the top of the page
+Quote Post
Wykladowca
post
Post #5





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 19.04.2006

Ostrzeżenie: (0%)
-----


Wtyczka obsługuje Xforms, ale już nie Web Forms 2. Te pierwsze mnie nie grzeją. Jakoś niezbyt uśmiecha mi się uczenie i pisanie czegoś, co jest obsługiwane przez wtyczki, a bez add-onów zamiast formularzy jest kaszana.

No to pozostaje swf lub wybieranie równo we wszystkich przegladarkach po jednym pliku. Chyba że dopiszę ratowanie wejścia w php. Rozwiązanie brzydkie, ale powinno działać póki nie zostanie obcięty sam ciąg z danymi obrazka.

Jakby ktoś miał podobny problem: ew. można zrobić na serwerze obsługę archiwów, aby to obejść. Trzeba tylko wtedy uważać z kontrolą spakowanych plików.

Nic więcej nie da się zrobić, winny znaleziony, ale problem nie rozwiązany. Nie wiem czy oznaczać [SOLVED] czy jakoś inaczej...

DODANO:
  1. <?php
  2. $input = file_get_contents("php://input");
  3. //echo $input;
  4. if(strpos($input, '</submission>')===false)
  5. {
  6.    $fix = substr_count($input, '<file');
  7.    if($fix>12) die('Dane uszkodzone z powodu błędu przeglądarki. Spróbuj wysłać mniej niż 13 plików');
  8.    $fix_str="r\n</file>r\n</submission>";
  9.    $input.=substr($fix_str, -($fix-1)*2);
  10. }
  11. ?>


Działa toto nawet (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

DODANO:
Żeby zwiększyć ilość plików które można wysłać, dodałem tag do formularza wydłużający stałą końcówkę danych

Formularz wygląda tak:
  1. <form action="/actions/uploadtotemp.php" method="post" enctype="application/x-www-form+xml">
  2. <p>
  3. <label><input type="file" name="strips" multiple="multiple" max="50">Maks. 50 plików</label>
  4. <input type="hidden" name="abcdefghijklmnoprstuwyzabcdefghijklmnoprstuwyz" value="">
  5. <input type="submit" value="Wyślij">
  6. </p>
  7. </form>


a w skrypcie zmieniły się dwie liniki
  1. <?php
  2. if($fix>52) die("Dane uszkodzone z powodu błędu przeglądarki. Spróbuj wysłać mniej niż 52 pliki");
  3.    $fix_str="r\n</file>r\n<field name=\"abcdefghijklmnoprstuwyzabcdefghijklmnoprstuwyz\" index=\"0\"></field>r\n</submission>";
  4. ?>


Ten post edytował Wykladowca 20.01.2009, 12:50:02
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 13:52