Indy将Memorystream上传到FTP

Jen*_*olt 1 delphi indy indy10 delphi-xe6

我在运行时从屏幕截图生成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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

它不是我的FTP服务器,而是托管我的域的人所拥有的服务器.这是刚刚上传的jpg的链接:http://fluffykids.dk/test.jpg,这是我保存到光盘的jpeg:http://fluffykids.dk/aa.jpg.

问题:上传后我为什么要丢失JPEG的"内容"?

Sir*_*ufo 5

你必须设置TIdFTP.TransferTypeftBinary.默认是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;    
Run Code Online (Sandbox Code Playgroud)