Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Odbieranie danych przez $_GET
Forum PHP.pl > Forum > PHP
xamrex
Witam,
Czy jest możliwość przesłania danych, które nie sa znakami asci i zawierają znak & poprzez $_GET

Sprawa wygląda tak. Postawiłem stronę WWW - strona2.php
  1. <?php
  2.  
  3. $myfile = fopen("fota.txt", "w") or die("Unable to open file!");
  4. $txt = $_GET["data"];
  5. fwrite($myfile, $txt);
  6. fclose($myfile);
  7. ?>

I teraz jak wejdę na www.mojastrona.pl/strona2.php?data=123
to później jak wejdę na www.mojastrona.pl/fota.txt
to mam w niej zawartość 123.

Ale co jeśli chciałbym wysłać jakieś dane które nie są znakami ASCI oraz dodatkowo mogą zawierać znaki takie jak . ? &
Wtedy będzie to źle 'zrozumiane' przez serwer i jeśli chciałbym wysłać taką paczkę danych:
Tajne&dane to w pliku fota.txt będę miał tylko tajne
Da się jakoś sprawić, żeby znak & był ignorowany?

Generalnie posiadam moduł Wifi ESP8266, który można fajnie programować i który służy do łączenia się z internetem, i chciałbym wysłać nim dane, ale moga one zawierać znak &, więc musiałbym wymyślić coś innego.
Ktoś wie jak to rozwiązać?
EDIT:
Myślę, że można znaleść jakiś algorytm, który zakodowałbymi dane tak, żeby wynikiem były tylko znaki alfabetu. wtedy mógłbym to przesłać. Czy to dobry pomysł?
Azek
Myślę, że to może pomóc: base64_encode($str). Po otrzymaniu przez get odkodujesz za pomocą: base64_decode($str)
Pyton_000
http://php.net/manual/en/function.urlencode.php
xamrex
Hej.
Pomysł z base64 wydawał się świetny.
Myślałem,że już wszystko rozwiązane, ALE
bo zakodowaniu tego w base64 ( a nawet przed zakodowaniem) dane które chce przesłać mają ok 28kb.
Jak wysyłam je w polu adresu dostaję komunikat:
Request-URI Too Long
The requested URL's length exceeds the capacity limit for this server.

Wiem, że można zmienić ustawienia serwera ale na pewno na to administrator się nie zgodzi.
WIęc jedyne rozwiązanie któe widzę, to wysyłanie tych danych w paczkach:<

No chyba, że ma ktos jakis pomysł jeszcze?
markuz
Nie możesz ich wysłać metodą POST?
Pilsener
Cytat
Czy jest możliwość


Nie ma takiej możliwości, bo GET nie służy do przesyłania danych.
lolo121
Cytat(xamrex @ 20.04.2018, 09:20:06 ) *
Hej.
Pomysł z base64 wydawał się świetny.
Myślałem,że już wszystko rozwiązane, ALE
bo zakodowaniu tego w base64 ( a nawet przed zakodowaniem) dane które chce przesłać mają ok 28kb.
Jak wysyłam je w polu adresu dostaję komunikat:
Request-URI Too Long
The requested URL's length exceeds the capacity limit for this server.

Wiem, że można zmienić ustawienia serwera ale na pewno na to administrator się nie zgodzi.
WIęc jedyne rozwiązanie któe widzę, to wysyłanie tych danych w paczkach:<

No chyba, że ma ktos jakis pomysł jeszcze?


zamiast & spróbuj w adres dać %26
xamrex
Hej,
Cytat(markuz @ 20.04.2018, 09:24:24 ) *
Nie możesz ich wysłać metodą POST?

Nie, niestety nie mogę ;( MOduł na to nie pozwala

Stanęło na tym, zę będę dane kodował base64, i wysyłał po kilka razy.
Na serwerze gdzie mam stornę, max długość adresu to 8kb, więc będę 3-4x musiał wysłać te moje dane.
Chyba nic innego nie wymyślę.
LowiczakPL
... przecież moduł Wifi ESP8266 może przesyłać POST

Czego używasz Arduino?

  1. #include <ESP8266HTTPClient.h>
  2. #include <ESP8266WiFi.h>
  3.  
  4. ...
  5. int httpCode = http.POST("Message from ESP8266");
  6. ...



albo

  1. #include <ESP8266WiFi.h>
  2. ...
  3. client.println("POST / HTTP/1.1");
  4. ...

xamrex
Witam serdecznie
Udało mi się wysłać dane metodą POST, ale niestety dalej są problemy.
Generalnie moja storna wygląda tak:
  1. <?php
  2. $dane = $_POST['data'];
  3. $myfile = fopen("zdj.jpg", "w") or die("Unable to open file!");
  4. fwrite($myfile, $dane);
  5. fclose($myfile);
  6. echo"Dane przeslano! - ";
  7. $ilosc=strlen($dane);
  8. echo $ilosc;
  9. ?>


I teraz dla testów uzywam oprogramowaia ZOC7terminal i gdy nim wysyłam dane:
  1. POST /jomla/strony.php HTTP/1.1
  2. Content-Type: application/x-www-form-urlencoded
  3. Host: mojastrona.pl
  4. Content-Length: 15
  5.  
  6. data=0123456789

To tworzy się plik zdj.jpg z zawartością : 0123456789.

Problem jest jeśli chce wysłać dane binarne.
Tzn prawie wszystko działa, ale gdy wysyłam 0x26 czyli znak '&' to do pliku zdj.jpg lecą wszystkie dane do momentu wystąpienia tego znaku.

Pomyślałem, że zmodyfikuję nagłówek i puszczę coś takiego:
  1. POST /jomla/strony.php HTTP/1.1
  2. Content-Type: application/octet-stream
  3. Host: mojastrona.pl
  4. Content-Length: 15
  5.  
  6. data=0123456789

ale po czymś takim to w ogóle plik zdj.jpg ma 0 bajtów (nic do niego nie leci)

DOmyślam, się, że winny jest ten nagłowek Content-Type: application/octet-stream i jeśil go ustawię to do $dane = $_POST['data'];nic nie przychodzi
Pomożecie jakoś?

P.S
wiem, ze mogę użyć Base64 tak jak radziliście, ale może da się to jakoś obejść?
Bo chyba da się wysłać dane z pełnym zakresie od 0x00 do 0xff na serwer przez post
LowiczakPL
binarne dane przesyłaj "Content-Transfer-Encoding: binary"
ale jak przesyłasz obrazek to dodaj nagłówek "Content-Type: image/jpeg"

przykład jak wysłać pliki

https://tttapa.github.io/ESP8266/Chap12%20-...o%20Server.html
xamrex
Cytat(LowiczakPL @ 24.04.2018, 23:07:41 ) *
binarne dane przesyłaj "Content-Transfer-Encoding: binary"
ale jak przesyłasz obrazek to dodaj nagłówek "Content-Type: image/jpeg"

przykład jak wysłać pliki

https://tttapa.github.io/ESP8266/Chap12%20-...o%20Server.html

Jak dodam ten nagłówek encoding:binary, czyli mój nagłówek będzie wyglądał tak:
  1. POST /jomla/strony.php HTTP/1.1
  2. Content-Type: application/x-www-form-urlencoded
  3. Host: mojastrona.pl
  4. Content-Transfer-Encoding: binary
  5. Content-Length: 15
  6.  
  7. data=0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27 0x28 0x29

To w pliku zdj.jpg będę miał wartości tylko 0x21 0x22 0x23 0x24 0x25


Natomiast jak zmienię nagłówek na:
  1. POST /jomla/strony.php HTTP/1.1
  2. Content-Type: application/octet-stream
  3. Host: mojastrona.pl
  4. Content-Length: 15
  5.  
  6. data=0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27 0x28 0x29

to w pliku zdj.jpg nie mam nic.


Wydaje mi się, że $_GET odbiera tylko dane jak ten nagłówek jst Content-Type: application/x-www-form-urlencoded.
jednak tym sposobem nie prześlę znaku '&'
LowiczakPL
no ale data ty musisz wypełnić swoimi odpowiednimi danymi dostosowanymi do nagłówka.

Znasz C czy raczej nie?
xamrex
Znam
Cytat
no ale data ty musisz wypełnić swoimi odpowiednimi danymi dostosowanymi do nagłówka.

Jak to?
Nagłówki wysyłam przed 'contentem'

Czyli wysyłam te swoje nagłówki:
  1. POST /jomla/strony.php HTTP/1.1
  2. Content-Type: application/x-www-form-urlencoded
  3. Host: mojastrona.pl
  4. Content-Transfer-Encoding: binary
  5. Content-Length: 15
  6. //tutaj dwa razy \r\n
  7. data=0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27 0x28 0x29


No i jeśli robie to w taki sposób, to do pliku strony.php dane które są odbierane przez $_POST['data']; to tylko dane do cyfry 0x26

No i nie wiem jak to rozwiązać.
Mógłbyś mnie bardziej nakierować?
Pyton_000
A

$postdata = file_get_contents("php://input");
file_put_contents('zdj.jpg', $postdata);

xamrex
Pyton, spróbuję po 18:00 i dam znać ;-)
Byłoby super gdyby sie udało ;-)

Cytat(Pyton_000 @ 25.04.2018, 08:13:13 ) *
A

$postdata = file_get_contents("php://input");
file_put_contents('zdj.jpg', $postdata);

Super działa.
Naprawdę bardzo bardzo dziękiuję exclamation.gif!
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.