Indy 将 Memorystream 上传到 FTP

Indy upload Memorystream to FTP

我在运行时从屏幕截图生成 JPEG,并想将其上传到 FTP 服务器。但是当我上传它时,它不再是有效的 jpeg。

在这个例子中,我只是从 HD 加载位图:

首先是一些代码:

procedure TForm13.Button1Click(Sender: TObject);
var
  InBitmap: TBitmap;
  JpegImage: TJpegImage;
  MemoryStream: TMemoryStream;
  IdFTP: TIdFTP;
begin
  InBitmap := TBitmap.Create;
  MemoryStream := TMemoryStream.Create;
  JpegImage := TJpegImage.Create;
  IdFTP := TIdFTP.Create(self);

  try
    InBitmap.LoadFromFile('C:\aa\test.bmp');

    JpegImage.Assign(InBitmap);
    JpegImage.CompressionQuality := 65;
    JpegImage.SaveToStream(MemoryStream);

    with IdFTP do
      try
        Host := <HOST>;
        Username := <USER>;
        Password := <PASS>;
        Port := 21;
        Passive := True;
        Connect;
        MemoryStream.Position := 0;
        Put(MemoryStream, 'test.jpg');
      finally
        Disconnect;
      end;    
  finally
    IdFTP.Free;
    JpegImage.Free;
    InBitmap.Free;
    MemoryStream.Free;
  end;
end;

我尝试在上传之前将 JPEG 保存到文件中,它是一个有效的 JPG

我尝试在上传之前将 MemortStream 保存到一个文件中,它是一个有效的 JPG

但是当它上传到 FTP 服务器时,它只是一个空白的 JPG 文件,但仍然 "valid"。

这不是我的 FTP 服务器,而是由我的域托管人拥有的。这是刚刚上传的 jpg 的 link:http://fluffykids.dk/test.jpg and here is the jpeg I saved to disc : http://fluffykids.dk/aa.jpg

问题:为什么我上传 JPEG 后 "content" 丢失了?

您必须将 TIdFTP.TransferType 设置为 ftBinary。默认值为 ftASCII,这有所不同。

with IdFTP do
  try
    Host := <HOST>;
    Username := <USER>;
    Password := <PASS>;
    Port := 21;
    Passive := True;

    TransferType := ftBinary;

    Connect;
    MemoryStream.Position := 0;
    Put(MemoryStream, 'test.jpg');
  finally
    Disconnect;
  end;