Проблемы с отправкой JPG через Tidtrivialftp.Файл получил 0 КБ - PullRequest
1 голос
/ 27 марта 2019

Я устанавливаю программное обеспечение (SOFT1), которое захватывает видеокадры в формате JPG и отправляет их в другое программное обеспечение (SOFT2) с помощью Tidtrivialftp.

SOFT2 - получить Jpeg и отобразить его в TImage для просмотра.

Я не уверен, что я делаю неправильно. Код вырезан из другого поста здесь. Кажется, это работает, но я ничего не получаю в своем TImage, и если я пытаюсь сохранить на диск, я получаю файл 0 КБ.

Я попытался реализовать решение, найденное по этой ссылке:

Поток изображений UDP, delphi indy10

Попытка отправить небольшой файл test.jpg размером всего 2,48 КБ для целей тестирования.

Клиентская сторона:

procedure TForm1.BtnClick(Sender: TObject);
var
  Myjpg: TJPEGImage;
  Strmkoko : TMemoryStream;
begin

try
    //Tried a lot of different ways to load the jpg into a stream. This is the latest one with same results.

    Strmkoko := TMemoryStream.Create;
    Myjpg := TJPEGImage.Create;
    Myjpg.LoadFromFile('C:\Users\Etienne\Desktop\MyVideo\a\test.jpg');
    Myjpg.SaveToStream(Strmkoko);
    Strmkoko.Position := 0;
    Image1.Picture.assign(Myjpg); //Confirming MyJpg is showing the picture by placing it in a TImage component before sending - All ok

    //Also tried to just put the filename instead of stream. - no difference
    IdtrivialFTPClientFrameGrab.Put(Strmkoko, 'test.jpg');

finally
    Strmkoko.Free;
    Myjpg.Free;
end;
end;

Сторона сервера:

procedure TForm2.IdFTPServerFrameGrabTransferComplete(Sender: TObject;
  const Success: Boolean; const PeerInfo: TPeerInfo; var AStream: TStream;
  const WriteOperation: Boolean);
var
jpg: TJPEGImage;
begin
  if WriteOperation and Success then
  begin
    jpg := TJPEGImage.Create;
    try
      jpg.LoadFromStream(AStream);
      jpg.SaveToFile('C:\Users\Etienne\Desktop\Pic\test.jpg'); //trying to save the jpg to check what I get and its 0KB
      img1.Picture.Assign(jpg); //This is the final place I want to send the stream
    finally
      jpg.Free;
    end;
  end;
end;

procedure TForm2.IdFTPServerFrameGrabWriteFile(Sender: TObject;
  var FileName: string; const PeerInfo: TPeerInfo; var GrantAccess: Boolean;
  var AStream: TStream; var FreeStreamOnComplete: Boolean);
begin
  if Filename = 'test.jpg' then
  begin
    //Code does get in here when I debug
    GrantAccess := True;
    AStream := TMemoryStream.Create;
    FreeStreamOnComplete := True;
  end else
    GrantAccess := False;
end;

Я ожидаю, что файл, который я отправляю (test.jpg), появится в img1 и также будет сохранен в 'C: \ Users \ Etienne \ Desktop \ Pic \ test.jpg'

Код работает так, как если бы он сохранил файл и присвоил ему img1, но он пуст.

Все это делается локально.

Это как "IdtrivialFTPClientFrameGrab.Put (Strmkoko, 'test.jpg');" отправляет пустой файл. Но я пробовал несколько способов загрузки потока и всегда один и тот же результат.

Я понимаю, что TCP / IP был бы лучше, но я бы хотел, чтобы это работало. Любая помощь будет оценена.

Ура, E.

1 Ответ

1 голос
/ 27 марта 2019

После многих испытаний я выяснил проблему.Я не знаю, почему это было опущено в примерах, показанных в других постах, но после того, как вы получили поток, вам нужно сбросить его позицию, прежде чем вы сможете загрузить его ...

AStream.Position: = 0;

procedure TForm2.IdFTPServerFrameGrabTransferComplete(Sender: TObject;
  const Success: Boolean; const PeerInfo: TPeerInfo; var AStream: TStream;
  const WriteOperation: Boolean);
var
jpg: TJPEGImage;
begin
  if WriteOperation and Success then
  begin
    jpg := TJPEGImage.Create;
    try
      AStream.Position := 0; // <----- insert here
      jpg.LoadFromStream(AStream);
      jpg.SaveToFile('C:\Users\Etienne\Desktop\Pic\test.jpg'); //trying to save the jpg to check what I get and its 0KB
      img1.Picture.Assign(jpg); //This is the final place I want to send the stream
    finally
      jpg.Free;
    end;
  end;
end;
...