Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][Web Forms 2] Ucinanie danych POST
Forum PHP.pl > Forum > PHP
Wykladowca
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ś)
pinochet
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
Wykladowca
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ć...
pinochet
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".
Wykladowca
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 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. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.