2011-10-25 75 views
0

Indyスレッドがたくさんあることは知っていますが、私の場合と一致するものはありません。Delphi 5でIndyと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をクリックするだけでも、またはCookieを使用する必要がありますか?

おかげ

答えて

2

あなたのコード内のいくつかのバグがあります

1)PostData()はHTTPSのURLを要求しているが、それはTIdHTTP.IOHandlerプロパティにSSL対応のIOHandlerを割り当てていません。あなたはそうする必要があります。

2)Button1Click()のでTIdHTTPは、既存のURLに対する相対としてそのURLを処理してしまうので、https://www.testurl.com/test/testurl.com/test/reports.php代わりのhttps://testurl.com/test/reports.phpからダウンロードしようと、任意のプロトコルを指定していないGetUrlToFile()にURLを渡しています。相対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-aroundaroundありがとう – notidaho

0

問題1)今、別のポストで解決されています: Delphi 5 Indy/ics SSL workaround?

次のように私は、残りのヘルプを大幅にいただければ幸いですが。

同じIdHTTPオブジェクトと追加のURL変数を使用してGET呼び出しを行う必要がありますか?新しいIdHTTPオブジェクトを作成する必要がありますか?

クッキーを使用してセッションを記録する必要がありますか?これはすべて同じ呼び出しで行うことができますか?

上記のGET呼び出しは実際にCSVファイルに保存する必要がありますか?とにかくデータをインポートする必要があるため、直接処理することもできます。

現在のコードは、エラーを取得します。EIdHTTPProtocolException

関連する問題