Wysyłanie zrzutu ekranu do PHP

0

Witam
Piszę aplikację która ma wysyłać zrzut ekranu do strony internetowej napisanej w PHP
obecnie posługuję się poniższym kodem i teoretycznie wszystko działa tylko że chciał bym go zoptymalizować
chodzi o to że obecnie muszę zapisać plik ze zdjęciem na dysku i dopiero moge go wysłać
a chciał bym robić to bezpośrednio
niestety nigdzie w internecie nie znalazłem innego sposobu na wysyłanie plików jak tylko ten co obecnie używam
Proszę o pomoc i pozdrawiiam

Oto funkcja o którą chodzi

function TExecutiveUnit.printscreen:string;
var
  src        : TIdMultiPartFormDataStream;
  StreamOut1 : TStringStream;
  Can        : TCanvas;
  BMP        : TBitmap;
  JPG        : TJPEGImage;
  plik       : string;
begin
  try
   try
    plik:=ExtractFilePath(Application.ExeName)+cu.id+'.jpg';
    Can := TCanvas.Create;                        {tworzenie zmiennej }
    Can.Handle := GetWindowDC(GetDesktopWindow);  {przechwycenie uchwytu ekrnau }
    BMP := TBitmap.Create;                        {tworzenie bitmapy }
    BMP.Width := Screen.Width;                    {szerokosc bitmapy taka jak ekranu}
    BMP.Height := Screen.Height;                  {wysokosc bitmapy taka jak ekranu}
    BMP.Canvas.CopyRect(Rect(0, 0, Screen.Width, Screen.Height), Can, Rect(0, 0, Screen.Width, Screen.Height));{skopiu Cam do BMP}
    JPG := TJPEGImage.Create;
    JPG.Assign(bmp);                 {Skopiuj}
    jpg.CompressionQuality:=50;
    jpg.Compress;
    JPG.SaveToFile(plik);
    application.ProcessMessages;
    src := TIdMultiPartFormDataStream.Create;
    StreamOut1 := TStringStream.Create('');
    src.AddFile('plik',plik, 'multipart/form-data');
    form1.idhttp1.Post(serwer+'live/nowyscr.php', src ,StreamOut1);
    form1.komunikat(clMoneyGreen,PChar(StreamOut1.DataString));
    form1.komunikat(clMoneyGreen,'>>Wysylanie pliku do PHP : OK<<');
    application.ProcessMessages;
  except form1.komunikat(clred,'>>Wysylanie pliku do PHP : ERROR!<<');end;
  finally
    Can.Free;
    JPG.Free;
    BMP.Free;
    src.Free;StreamOut1.Free;
    deleteFile(plik);
  end;
end; 
0

Za pewne przezajebiste Indy, którego używasz pozwala również,
tak jak znienawidzone przez wielu Synapse aby metodą POST na
serwer wysłać to co się chce, ale bez wczytywania z pliku - tylko
w postaci TMemoryStream. Dlatego nie zapisuj do pliku, tylko do
TMemoryStream (w synapse takowym jest zmienna Document) i
to wyślij na serwer. Jak to dokładnie zrobić w Synapse - dowiesz
się z dokumentacji i przykładów. W Indy nie mam pojęcia, ale to
może ktoś inny Tobie pomoże lepiej. Do haterów: używajcie tego
waszego kochanego Indy, do Synapse już nikogo nie namawiam,
a że nikt do tej pory nie odpisał pytającemu to podałem przykład.

EDIT: jeśli zdecydujesz się na Synapse to może się Tobie przydać
funkcja HttpPostFile z modułu httpsend, kiedyś z niej korzystałem,
no i z tego co pamiętam działa, a ewentualnie można ją przerobić.

0

IdTCPClient.WriteStream(MemStream, True, True) przy założeniu że masz obrazek włożony do strumienia MemStream.

0

Witam
dzięki za odpowiedź
Synapse niestety musze sobie na razie darować ponieważ cała reszta programu jest już zrobiona na INDY i mogło by to zrobić lekkie zamieszanie no ale jak nie znajde nic innego...

A jeśli chodzi o
IdTCPClient.WriteStream(MemStream, True, True)
to oczywiście można tak zrobić ale tylko przy połączeniu Klient ->Serwer Komputer-> Komputer
a ja chce wysłać obrazek do PHP i musze korzystać z idHTTP chyba że przez idTCPClient też się da ale nigdzie nie ma o tym wspomnianego słowa
a owszem idHTTP ma możliwość zapisu do strumienia tyle ze hmm google o tym też milczy a ponadto gdzie ten strumien jest wysyłany i jak go odebrać ??
Pozdrawiam

0

Hmm... może tak troche nie na temat, ale nie ma możliwosci przesłania pliku przez FTP?

0

Oczywiście że jest taka możliwość ale działa to odziwo dużo wolniej niż nawet przez PHP a ponadto pojawia się ten sam problem że musi być fizyczny plik

0

ja bym poszperał w zrodlach indy w metodach TIdMultiPartFormDataStream.
zajrzyj co jest w srodku "AddFile", na bank da sie przerobic to tak zeby nie czytalo z pliku tylko bezposrednio ze strumienia.

///zaciekawilo mnie "AddObject"... wklepalem w googlach i oto pierwszy wynik:
http://forums2.atozed.com/viewtopic.php?f=7&t=851


Use the TIdMultipartFormDataStream's AddObject() method instead of its AddFile() method. AdObject() supports TStream and TStrings objects. So you can save your file data to a TStream, such as TMemoryStream, and have TIdHTTP post it, ie:

...
TMemoryStream *ms = new TMemoryStream;
// load image data into ms, then...
s->AddObject("pict", "image/bitmap", ms, "image.bmp");
...
http->Post(..., s);
...
delete s;
delete ms;
...
0

Heh
Dzięki kolego cimak
masz u mnie <piwo> :-)
o to właśniie chodziło

0

Rozdział 18

Może to cię zainteresuje.

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