2015-04-16 143 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) –