[BCB][PHP] Wysłanie pliku na serwer

0

Witam. Mam mały problem z wysyłaniem pliku na serwer - skrypt php działa przez przeglądarkę natomiast nie chce za bardzo działać z moim programem. Wiem że skrypt jest ok i w kodzie programu nawala coś tylko nie wiem co źle robię.

<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
 <head>
  <meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
  <title>Wysyłanie pliku na serwer</title>
 </head>
<body>
<?
 if(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')
   {
    $global_path="c:/usr/krasnal/www/mobileapplications/";
   }else{
         $global_path="/home/users/setesh/mobileapplications/";
        };

 if(is_uploaded_file($plik))
   {
    $nazwa = uniqid("").$plik_name;
    $wielkosc = $file_size;
    echo "Plik <b>$nazwa</b> ($wielkosc) został przesłany!<br>";
    move_uploaded_file($plik, $global_path.'uploadpliku/ss/'.$nazwa);
   }
?>

<form action="index.php" method="post" enctype="multipart/form-data">
 <input type="hidden" name="MAX_FILE_SIZE" value="1200000">
 <input name="plik" type="file">
 <input type="submit" value=" wyslij">
</form>

</body>
</html>

W BCB wykorzystuję komponent TClientSocket z parametrami :
Port : 80
Host : localhost
Nazwa komponentu : c

Kod w BCB wygląda następująco :

//---------------------------------------------------------------------------
void TForm::POST(AnsiString HomePath, AnsiString Zmienne, AnsiString Path)
{
 AnsiString Pakiet,
            UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5 (.NET CLR 3.5.30729)";

 Pakiet = "POST "+HomePath+" HTTP/1.1 \r\n";
 Pakiet += "Host: "+c->Host+"\r\n";
 Pakiet += "User-Agent: "+UserAgent+"\r\n";
 Pakiet += "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
 Pakiet += "Accept-Language: pl,en-us;q=0.7,en;q=0.3\r\n";
 Pakiet += "Accept-Encoding: gzip,deflate\r\n";
 Pakiet += "Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7\r\n";
 Pakiet += "Keep-Alive: 300\r\n";
 Pakiet += "Connection: keep-alive\r\n";
 Pakiet += "Referer: "+Path+"\r\n";
 Pakiet += "Content-Type: multipart/form-data; boundary=---------------------------41184676334\r\n"; // !!!!!!!!
 Pakiet += "enctype: multipart/form-data\r\n";
 Pakiet += "Content-Length: 18953\r\n"; // +IntToStr(Zmienne.Length())+"\r\n";
 Pakiet += "\r\n";
 Pakiet += "-----------------------------41184676334\r\n";
 Pakiet += "Content-Disposition: form-data; name=\"MAX_FILE_SIZE\"\r\n";
 Pakiet += "\r\n";
 Pakiet += "1200000\r\n";
 Pakiet += "-----------------------------41184676334\r\n";
 Pakiet += "Content-Disposition: form-data; name=\"plik1\"; filename=\"Desertmoon.jpg\"\r\n";
 Pakiet += "Content-Type: image/jpeg\r\n";
 Pakiet += "\r\n";

 Pakiet += Zmienne;
 c->Socket->SendText(Pakiet);
}
//---------------------------------------------------------------------------
void __fastcall TF_main::cWrite(TObject *Sender, TCustomWinSocket *Socket)
{

 FILE *in;
 bool RFile = true;
 String errors = "",
          Filer  = "";
 char ch;

 if((in = fopen(Edit3->Text.c_str(), "a+")) == NULL)
   {
    fprintf(stderr, "Cannot open input file.\n");
    RFile = false;
    errors = "Błąd wczytywania pliku\n";
   }

 if(RFile)
   {
    fseek(in, 0, SEEK_SET);
    while(!feof(in))
         {
          ch = fgetc(in);
          Filer = Filer + ch;
         }
   }else{
         ShowMessage(errors);
        }
 fclose(in);


            fPOST(
                   "/~mobileapplications/uploadpliku/posted.php",
                   Filer,
                   "http://localhost/~mobileapplications/uploadpliku/posted.php"
                  );
//---------------------------------------------------------------------------
void __fastcall TF_main::Button2Click(TObject *Sender)
{
 c->Active=true;
}
//--------------------------------------------------------------------------- 

Zgrałem sobie triala sniffera do HTTP a mianowicie HTTP Debugger Pro 3.2. Po przejrzeniu co przesyła FireFox i mój program udało mi się dojść do tego jak wysłać plik na serwer ale...

(PS : Znacie jakiś darmowy i dobry sniffer HTTP ??? Jak tak to dajcie z łaski swojej nazwy i/lub linki bo sam nie mogłem coś znaleźć)

Na serwerze powstaje plik ale tylko z początkową zawartością - w IrfanView wywaliło mi że brakuje SOS markera i ogólnie plik który na serwerze się tworzy ma 300-ta coś bajtów.

Mój problem polega na tym że nie wiem dokładnie co nawala (przypuszczam że jakiś znak w pliku graficznym bo na takich testuję)

Będę wdzięczny jak pomożecie mi to poprawić co jest nie tak bo jakoś mi nie wychodzi Sad

Część rzeczy ustawiłem na stałe dla tego pliku graficznego.

Pytanie dodatkowe - Co oznacza i za co odpowiada w HTTP :

  • "boundary=---------------------------41184676334" - nie wiem do czego to chociaż pewnie potrzebne !!!
  • "41184676334" - Co oznacza ta wartość po boundary - na pewno odnosi się do pliku ale nie wiem po co to i jak już jak to wyliczyć
  • "Content-Length: 18953" - To jak rozumiem to wielkość przesyłanych danych pliku - wystarczyło by wyliczyć wielkość pliku w b/B/KB ???
0
  1. HTTP jest opisany w odpowiednich dokumentach RFC, nie musisz sniffować, by się dowiedzieć co akurat ten misio ma w środku.
  2. Fiddler2. Podsłuchuje i notuje ruch HTTP/HTTPS, działa jako proxy.
  3. Żeby wysłać plik via HTTP musisz go zakodować BASE64 zdaje się - więc żaden znak w pliku graficznym nie powinien mieć wpływu. Content-length to o ile pamiętam długość danych żądania już po zakodowaniu.
0
Ktos napisał(a)
  1. HTTP jest opisany w odpowiednich dokumentach RFC, nie musisz sniffować, by się dowiedzieć co akurat ten misio ma w środku.
  2. Fiddler2. Podsłuchuje i notuje ruch HTTP/HTTPS, działa jako proxy.
  3. Żeby wysłać plik via HTTP musisz go zakodować BASE64 zdaje się - więc żaden znak w pliku graficznym nie powinien mieć wpływu. Content-length to o ile pamiętam długość danych żądania już po zakodowaniu.

Z tego co przeglądałem nagłówki wysyłane przez mój program i przez firefoxa to to co wysyła mój program jest takie same jak w firefoxie (przynajmniej ta część która jest wysyłana bo reszta co nie idzie to nie wiem :( )

Ogólnie szukałem trochę o BASE64 i postaram się zaraz coś wykombinować - jak się uda to super a jak nie... to tragedia :(

1 użytkowników online, w tym zalogowanych: 0, gości: 1