Problem: Wysyłanie plików graficznych metodą POST...

0

Mój problem jest następujący. W Delphi próbuje napisać najprostszy uploader plików graficznych. Pliki zamierzam wysyłać na ImageReverb - jeden z serwisów oferujacych hosting grafiki. Otóż korzystam z programiku napisanego przez Adama Boducha (wysłanie danych metodą POST) pochodzącego z Kompendium znajdującego się na Waszej stronie. W Delphi jestem totalną nogą. Orginalny skrypt z Kompendium zmieniłem do własnych potrzeb, wydaje się ze wszystko powinno działać (ciąg danych POST jest poprawny w 100%), a jednak wyskakuje błąd, po czym muszę restartować projekt, bo program debugguje bez końca... Co robić? Może jest jakiś inny sposób, a może coś po prostu robię nie tak? Może o sesje chodzi? Nie wiem nie znam się za bardzo na programowaniu. ;/

Wyskakujące okienko z błędem:
user image

Kod programu przerobiony już przeze mnie:

{
  Copyright (c) 2002 by Adam Boduch <[email protected]>
}

unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP, StdCtrls;

type
  TMainForm = class(TForm)
    HTTP: TIdHTTP;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    memMsg: TMemo;
    btnSendMsg: TButton;
    procedure btnSendMsgClick(Sender: TObject);
    procedure HTTPConnected(Sender: TObject);
    procedure HTTPDisconnected(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.btnSendMsgClick(Sender: TObject);
var
  StreamIn, StreamOut : TStringStream;
begin
{ utworzenie strumieni }
  HTTP.Host := 'www.imagereverb.com';
  StreamIn := TStringStream.Create('');
  StreamOut := TStringStream.Create('');
  try
    StreamIn.WriteString(Format('imbedded_progress_bar=1&upload_range=1&title=TITLE_TEST_TEST_TEST&adpaid=0&upfile_0=C:\screen.zip&section=adult&category=1&
memberid=9999&categories=&fontsize=&fontcolor=black&helpbox=&textarea=&no_script_submit=%s', [memMsg.Text])); // w miejscu %s występuje słowo 'Upload', ale ładuje je dopiero z pola 'formularza' (znajdującego się w programie)
    HTTP.Post('http://www.imagereverb.com/uu_file_upload.php', StreamIn, StreamOut); // wysłanie zawartości do skryptu
  { wyświetlenie odpowiedzi jaka została zwrócona przez skrypt }
    MessageBox(Handle, PChar(StreamOut.DataString), 'Wiadomość wysłana :-)', MB_ICONINFORMATION);
  finally
  { zwolnienie zasobów }
    StreamIn.Free;
    StreamOut.Free;
  end;
end;

procedure TMainForm.HTTPConnected(Sender: TObject);
begin
  btnSendMsg.Enabled := False;
end;

procedure TMainForm.HTTPDisconnected(Sender: TObject);
begin
  btnSendMsg.Enabled := True;
end;

end.
0

Też tak miałem. To jest wina serwera gdzie wysyłasz posta. Więcej o nim na http://www.checkupdown.com/status/E302.html . Na innych serwerach <ort>na pewno </ort>by dzałało.

0

Ale czy to forma jakiegoś zabezpieczenia ze strony serwera, czy może błąd z mojej strony? Bo przecież wysyłanie z poziomu przęglądarki działa, więc nie rozumiem. Dlaczego dzieje się tak tylko podczas wykonywania z poziomu programu? BTW błąd dotyczy "czasowej niedostępności" serwera oraz przekierowania. Dziwne, przecież cały czas stronka, skrypt jest dostępny, więc to jakiś błąd programu, może wysyłam za mało danych, może cookie albo sesja potrzeba? W związku z tym moje pytanie: czy jest może jakiś program który monitorowałby co wysyła do serwera moja przeglądarka [cookies, POSTy, GETy, sesje] (wtedy wiedziałbym czego w pełni potrzebuje skrypt by działać porządanie)? ;)

bordeux udało Ci się jakoś zaradzić temu problemowi?

0

A jak ty chcesz cokolwiek wysłać, jak jesteś niezalogowany do IR. Najpierw musisz sie zalogować, odebrać cookies i później go używać.

0

A w ktorym konkretnie miejscu ty wysylasz ten plik? o_O

0

Teraz powiem tak.. :P Już wcześniej zrozumiałem swój błąd, tyle że nie edytowałem posta. Teraz najpierw się loguję, potem pobieram identyfikator sesji (SID) ze stronki i używając go wysyłam dane POST do stronki opowiedzialnej za odbiór plików... Pojawia sie komunikat o zakończeniu (czyli de facto wysłaniu) tyle tylko, że tak naprawdę obrazek się nie wysyła (nie widać go w panelu administracyjnym na stronce)...

try
StreamIn.WriteString(Format('user=%s&password=%s&action=login', [memMsgLog.Text, memMsgPass.Text]));
    HTTP.Post('http://www.imagereverb.com/index.php', StreamIn, StreamOut); // wysłanie zawartości do skryptu
    HTML := HTTP.Get('http://www.imagereverb.com/uu_file_upload.php');
    Memo1.Text := HTML;
// Pobieranie identyfikatora sesji
    str_Start := Pos('TMP_SID: ', HTML) + 9;
    tmp_SID := MidBStr(HTML, str_Start, 32);
// Wysyłanie danych POST
    StreamIn.WriteString('DANE POST'); // Ciąg w 95% poprawny
    Insert('http://www.imagereverb.com/cgi-bin/uu_upload.pl?tmp_sid=', tmp_SID, 0);
    HTTP.Post(tmp_SID, StreamIn, StreamOut); // wysłanie zawartości do skryptu
    ShowMessage('Wysłano!');
    HTML := HTTP.Get(tmp_SID);

Schizo85 prosiłbym o małą pomoc, tudzież wskazówkę... Liczę, że rozwiążesz mój problem... ;)

PS. Wydaje mi się, że rzecz w tych strumieniach. Może trzeba nowe utworzyć albo coś? Tyle tylko, że wtedy 'utracę' logowanie (przynajmniej tak mi się wydaje). Może chodzi o utrzymanie sesji? Żebym przed każdym wysłaniem nie musiał się logować. Tego jednak nie potrafię choć, tak jak zwykle zanim zapytam, 'googlowałem'...

0

Ale tam mieszasz. Nie potrzebny jest Ci ID sesji tylko cookie odpowiedzialne za autoryzacje nazywa sie: reverb_auth. Poszukaj gdzies na 4programmers jest dll Adama Boducha gdzie masz prosty dostep do protokolu http i odbierania i wysylania ciasteczek. To znacznie ulatwi ci sprawe. Z tego co pamietam byl tez do niej jakis krotki opis.

0

Nadal mam problem z tym uploadem. Nie potrafię wysłać nagłówka HTTP w formie "multipart/form-data". By uploadować plik do strony http://www.imagereverb.com/cgi-bin/uu_upload.pl?tmp_sid=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa muszę wysłać DOKŁADNIE taki nagłówek:

POST /cgi-bin/uu_upload.pl?tmp_sid=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa HTTP/1.1
Host: www.imagereverb.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: PHPSESSID=5g3fc8eka8shg8at17139339l5; reverb_auth=slightyboy%asd78c7dh9s4897dfsdfa453
Content-Type: multipart/form-data; boundary=---------------------------19741299679623
Content-Length: 42324
-----------------------------19741299679623
Content-Disposition: form-data; name="imbedded_progress_bar"

1
-----------------------------19741299679623
Content-Disposition: form-data; name="upload_range"

1
-----------------------------19741299679623
Content-Disposition: form-data; name="title"

ASD
-----------------------------19741299679623
Content-Disposition: form-data; name="upfile_0"; filename="test.zip"
Content-Type: application/x-zip-compressed

PK

Nie mam pojęcia jak to zrobić. Może jakoś przy pomocy socketów, ale nie wiem jak to zrobić. Mógłby ktoś podać (najlepiej) przykład kodu, ja naprawdę męczę się nad tym niemiłosiernie a efekt żaden. :-/

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