plik w internecie - pascal

0

Witam
Czy istnieje możliwość umieszczenia pliku na zdalnym serwerze (www.domena.pl/plik.txt) i odczytanie do w turbo pascalu?

Pozdrawiam
Martodox

0

Myślę, że taki staroć nie da rady. Jak już raczej FreePascal może mieć coś do obsługi sieci i na pewno Delphi.

0

No to freepascal. Czy we freepascalu jest taka możliwość?
W delphi oczywiście jest taka możliwość, ale celowo nie piszę programu obiektowo :) tak dla wprawy postanowiłem coś w pascalu napisać.

Więc :) podrzuci ktoś jakieś rozwiązanie?

0

Delphi cię do żadnej obiektowości nie zmusza, skąd taki argument..
Tak, we Free Pascalu jest taka możliwość. W pakiecie jest moduł sockets (uses sockets). Ale bardziej polecam moduł WinSock z tej strony
http://home.earthlink.net/~akonshin/delphi_components.htm
tylko że jest przewidziany do Delphi, we Free Pascalu trzeba dodać na początku plików .pas (ale nie .inc) dyrektywy

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}

Z góry uprzedzam, że to nie będzie proste. Sokety są "głupie i trudne", trzeba poznać wiedzę na temat TCP/IP i HTTP.

0

Dokładnie jak Azarien napisał. Nie musisz używać obiektów, ale znowu babranie się w samym WinSocku to nie
dla mnie, ja bym zrobił tak. Pod Delphi 7 albo nowszym - utworzył aplikację konsolową o poniższym kodzie, a
do działania moja aplikacja potrzebuje pakietu Synapse i tylko tych modułów z listy w katalogu, z programem:

blcksock.pas
httpsend.pas
sswin32.pas
synacode.pas
synafpc.pas
synaip.pas
synautil.pas
synsock.pas

Program jak można się domyśleć pobierze nam plik z podnego adresu. Zaimplementowałem prostą obsługę w
przypadku przekierowania adresu. Niestety jest jedna wada program w Delphi 7 Personal spuchnie do 135 KB,
jednak po spakowaniu UPX'em z parametrem -9 zajmie już tylko 57 KB, to w dzisiejszych czasach nie jest tak
wcale dużo, a ma pewną funkcjonalność. Ty chcesz zrobić wysyłanie pliku na serwer, Tym się nie bawiłem, ale
wydaję mi się, że da się to zrobić metodą post do odpowiedniej strony. Więcej informacji jest w google oraz w
dokumentacji Synapse. Chyba, że koniecznie chcesz się męczyć we FreePascalu no to już wtedy Twój wybór ;/

program synapse_console_pobieranie;

{$APPTYPE CONSOLE}

uses
  httpsend;

procedure DownloadToFile(const URL : string; const FileName : string);
const
  Location_Prefix = 'Location:' + #32;
  Opera_UserAgent = 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.10';
var
  SynHttp : THttpSend;
  I, Position : integer;
  Str, DirectLink : string;
begin
  SynHttp := THttpSend.Create;
  try
    SynHttp.UserAgent := Opera_UserAgent;
    SynHttp.HTTPMethod('GET', Url);
    case SynHttp.ResultCode of
      301, 302 :
        begin
          for I := 0 to SynHttp.Headers.Count - 1 do
          begin
            Str := SynHttp.Headers[I];
            Position := Pos(Location_Prefix, Str);
            if Position > 0 then
            begin
              DirectLink := Copy(Str, Position + Length(Location_Prefix), MaxInt);
              Break;
            end;
          end;
          DownloadToFile(DirectLink, FileName);
        end;
    else
      SynHttp.Document.SaveToFile(FileName);
    end;
  finally
    SynHttp.Free;
  end;
end;

begin
  DownloadToFile('http://www.google.com/index.html', 'D:\test.html');
end.
0

Chyba, że koniecznie chcesz się męczyć we FreePascalu

Dlaczego męczyć? Ta sama biblioteka powinna w FPC też działać, być może po minimalnych zmianach w kodzie.

0

No jak uważasz - ja tam nie za bardzo mam doświadczenie w używaniu FreePascala - także przerobienie kilku
modułów od Synapse przy braku mojej wiedzy jak to zrobić były by męczarnią, bo trzeba kombinować z tym.

0

Już sprawdziłem, kompilują się bez zmian i działają (z wyjątkiem kilku do SSL)

0

Ok, czyli Martodox już wie czego może użyć we Free Pascalu. Tylko ja nie wiem, w jaki sposób obsłużyć moduł
HttpSend z Synapse. Czy w analogiczny sposób jak Delphi - FreePascal pozwala użyć obiektu niewizualnego? ;/

0

Tak. Zresztą twój przykład wymaga tylko dodania {$mode delphi} na początku, albo kompilowania z parametrem -Mdelphi
FreePascal ma taki mankament, że stara się być kompatybilny tylko sam ze sobą, więc każdy kawałek kodu przewidziany pod Delphi musi być z tą dyrektywą.

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