2015-04-16 65 views
1

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

在这个例子中,我刚刚从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文件,但仍然“有效”。

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

问题:为什么上传后我失去了JPEG的“内容”?

回答

5

您必须将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;  
+0

而你是100%正确,那么它的工作原理:D –

+0

不客气:o) –