2011-10-25 88 views
0

我知道有很多Indy線程,但是我找不到符合我的情況的線程。使用Indy在Delphi 5下載CSV

我收到了一個帶有用戶名和密碼錶單的URL。然後這個動作到一個URL/reports.php上有多個超鏈接。

這些鏈接中的每一個將直接指向包含URL變量的頁面,例如reports.php?report = variablename,其中下載將立即開始。

我至今想:

procedure TForm1.PostData(Sender: TObject); 
var 
    paramList:TStringList; 
    url,text:string; 
// IdHTTP1: TIdHTTP; 
    IdSSLIOHandlerSocket1: TIdSSLIOHandlerSocket; 
    idLogFile1 : TidLogFile; 
begin 

    idLogFile1 := TidLogFile.Create(nil); 
    with idLogFile1 do 
    begin 
    idLogFile1.Filename := 'C:\HTTPSlogfile.txt'; 
    idLogFile1.active := True; 
    end; 

    IdHTTP1 := TIdHTTP.Create(nil); 
    IdSSLIOHandlerSocket1 := TIdSSLIOHandlerSocket.Create(nil); 
    IdSSLIOHandlerSocket1.SSLOptions.Method := sslvSSLv23; 
    IdHTTP1.IOHandler := IdSSLIOHandlerSocket1; 


    IdHTTP1.HandleRedirects := true; 
    IdHTTP1.ReadTimeout := 5000; 
    IdHTTP1.Intercept := idLogFile1; 

    paramList:=TStringList.create; 
    paramList.Clear; 
    paramList.Add('loguser=testuser'); 
    paramList.Add('logpass=duke7aunt'); 
    paramList.Add('logclub=8005'); 
    url := 'https://www.dfcdata.co.uk/integration/reports.php?report=live'; 

    try 
    IdHTTP1.Post(url,paramList); 
except 
    on E:Exception do 
    begin 
    showMessage('failed to post to: '+url); 
    ShowMessage('Exception message = '+E.Message); 
    end; 
end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
reportType : String; 
begin 
    PostData(Self); 
    reportType := 'live'; 
    GetUrlToFile('',reportType+'.csv'); 
end; 


procedure TForm1.GetUrlToFile(AURL, AFile : String); 
var 
Output : TMemoryStream; 
success : Boolean; 
begin 
    success := True; 
    Output := TMemoryStream.Create; 
    try 
    try 
    IdHTTP1.Get(AURL, Output); 
    IdHTTP1.Disconnect; 
    except 
    on E : Exception do 
    begin 
     ShowMessage('Get failed to GET from '+IdHTTP1.GetNamePath +'. Exception message = '+E.Message); 
     success := False; 
    end; 
    end; 

    if success = True then 
    begin 
    showMessage('Filed saved'); 
    Output.SaveToFile(AFile); 
    end; 
    finally 
    Output.Free; 
    end; 
end; 

在每一個嘗試,我得到 「IOHandler無效」 的錯誤。顯然,我沒有正確發佈到最初的頁面,但任何人都可以告訴我我失蹤的是什麼?我也可以簡單地在登錄後點擊下載URL,否則我必須使用cookies?

感謝

回答

2

有在你的代碼的幾個錯誤:

1)PostData()正在請求HTTPS URL,但它不給TIdHTTP.IOHandler財產分配啓用SSL的IOHandler。你需要這樣做。

2)Button1Click()正在通過一個URL GetUrlToFile()未指定任何協議,所以TIdHTTP最終將處理該URL爲相對於它的現有的URL,並因此嘗試從https://www.testurl.com/test/testurl.com/test/reports.php代替https://testurl.com/test/reports.php下載。如果你想請求一個相對URL,不要包含主機名(或者在這種情況下甚至是路徑,因爲你發送多個請求到相同的路徑,只是不同的文檔)。

3)你正在泄漏TIdHTTP對象。

+0

謝謝雷米,對不起很多新問題。 1)我分配TIdHttp1.IOHandler:= IdSSLIOHandlerSocket1,但我然後收到錯誤「無法加載SSL庫」。我附加了一個TIdHttp1.Intercept:= IdLogFile,它只是讀取「Stat Disconnected」。 2)你是否建議我使用GetUrlToFile('/ reports.php?report = variable','test.csv'); ? 3)泄漏物體意味着什麼? @Remy Lebeau - TeamB – notidaho

+0

看來我的錯誤可能是由於錯誤的SSL dll。我在D5中使用了最新的Indy9庫。我加載了dpk並刪除了所有組件,下載了最新的10並運行了Fulld5.bat。我不知道這是否是升級的正確方法,但我收到各種消息說IndyProtocols50不使用或支持IdSSLOpenSSLHeaders和IdSSLOpenSSL,IndyX509。 – notidaho

+0

看起來這是D5的問題。我會重新發布,因爲它是一個不同的問題:http://stackoverflow.com/questions/7902152/delphi-5-indy-ics-ssl-workaround謝謝 – notidaho

0

第1期)現已解決在另一篇文章: Delphi 5 Indy/ics SSL workaround?

不過,我將不勝感激的休息幫助,如下所示。

我需要使用相同的IdHTTP對象和附加的URL變量進行GET調用嗎?或者我應該創建一個新的IdHTTP對象?

我需要使用cookie記錄會話還是可以使用同一個呼叫完成所有這些?

上面的GET調用實際上是我需要將csv保存到文件嗎?我也可以選擇直接處理它,因爲數據無論如何都需要導入。

目前代碼得到的錯誤:EIdHTTPProtocolException