File 无法通过FTP发送JPG。收到的文件为0KB

File 无法通过FTP发送JPG。收到的文件为0KB,file,delphi,udp,indy,transfer,File,Delphi,Udp,Indy,Transfer,我正在设置一个软件(SOFT1),它以JPG格式获取视频帧,并使用FTP发送到另一个软件(SOFT2) SOFT2将接收Jpeg并在TImage中显示以供查看 我不确定我做错了什么。代码是从这里的另一篇文章中剪切粘贴的。这似乎是可行的,但我在我的时间没有得到任何东西,如果我试图保存到磁盘,我会得到一个0KB的文件 我尝试实施此链接上的解决方案: 正在尝试发送一个仅为2.48KB的小test.jpg进行测试 客户端: procedure TForm1.BtnClick(Sender: TObje

我正在设置一个软件(SOFT1),它以JPG格式获取视频帧,并使用FTP发送到另一个软件(SOFT2)

SOFT2将接收Jpeg并在TImage中显示以供查看

我不确定我做错了什么。代码是从这里的另一篇文章中剪切粘贴的。这似乎是可行的,但我在我的时间没有得到任何东西,如果我试图保存到磁盘,我会得到一个0KB的文件

我尝试实施此链接上的解决方案:

正在尝试发送一个仅为2.48KB的小test.jpg进行测试

客户端:

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,但其为空

这些都是在本地完成的

它就像“idftpClientFrameGrab.Put(Strmkoko,'test.jpg');”发送的是一个空文件。但是我尝试了几种加载流的方法,结果总是一样的

我知道TCP/IP会更好,但我想让它发挥作用。任何帮助都将不胜感激

干杯,
E.

经过多次试验,我发现了这个问题。我不知道为什么在其他帖子的例子中省略了它,但是在你收到流之后,你必须重置它的位置,然后才能加载它

AStream.位置:=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;
过程TForm2.IdFTPServerFrameGrabTransferComplete(发送方:ToObject;
const Success:Boolean;const PeerInfo:tpeernfo;var AStream:TStream;
常量写操作:布尔);
变量
jpg:tjpeg图像;
开始
如果写操作成功,那么
开始
jpg:=TJPEGImage.Create;
尝试

AStream.Position:=0;//IDFTPClientFrameGrab的主机和端口以前已分配。另一方面,在这种情况下,应避免使用
TJPEGImage.SaveToStream()
,因为这将重新编码图像并丢失图像质量(JPG是一种有损格式,每次重新编码都会丢失质量)。发送文件时,应先将其直接加载到
TMemoryStream
中,然后根据需要将该流加载到
TJPEGImage
中。接收文件时,将
TMemoryStream
直接保存到文件中,并根据需要将流加载到
TJPEGImage
中。这样,接收者最终得到的是原始文件的精确副本,而不是有损版本。谢谢您的评论。我在这里发布了最后一次尝试,但一旦成功,我就将文件名传递给put命令,如下所示:“idftpClientFrameGrab.put(Filename,'test.jpg');”我更新了我以前的示例,以包含
位置
重置。
ftpserver
不会自动重置
位置的原因是组件的用户可以提供自定义流,因此服务器不会对用户在流传输完成后打算对其执行的操作做出任何假设。默认情况下,入站传输仅保存到磁盘文件中,不需要重置
位置
。但是,如果用户希望将流数据加载到UI中,那么用户需要根据需要重置
位置。try循环阻止我获得“JPEG错误#42”,这使我找到了正确的解决方案: