請問如何下載 HTTPS://xxx.xx 的檔案 |
缺席
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
請問如何下載 HTTPS://xxx.xx 的檔案 (Delphi 2007) 小弟雖然找到了一個關於 SSL 的範例 (如下), 測試可用 但是修改成下載檔案時, 執行失敗(如附件) (ssleay32.dll和libeay32.dll已經包入) ( 嘗試下載 https://nas.immigration.gov.tw/nasf/images/tops.gif ) 請問該如何修改 ??? 小弟修改部分: 1. edHostAddr 的 Text 改為 nas.immigration.gov.tw 2. Edit1 的 Text 改為 GET /nasf/images/tops.gif 3. IdTCPClient 的 Port 改為 443
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! 編輯記錄
pcboy 重新編輯於 2007-07-30 14:13:43, 註解 無‧
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
執行測試情況: 執行後, 第一次按下 Connect , 綠燈亮起(連線成功) 游標焦點跳到 "GET /nasf/images/tops.gif", 按下 Enter 後出現 HTTP/1.1 200 OK , 但是目錄中沒有看到 tops.gif 檔案 在 Edit1 的 Text 輸入 GET /nasf/images/tops.gif (因為會自動清空), 按下 Enter 這次居然出現 Server: Microsoft-IIS/5.0 又在 Edit1 的 Text 輸入 GET /nasf/images/tops.gif , 按下 Enter, 出現 Debugger Exception Notification Project sslClient10.exe raised exception class EAccessViolation with message 'Access Violation at address 0047E33F in module 'sslClient10.exe'. Read of address 00000014'. 為什麼每次出現錯誤訊息都不同 ??? 輸入的命令 "GET /nasf/images/tops.gif" 正確嗎? (小弟使用公司內網站用IE以HTTPS顯示, 去看ssl_access_log看到的命令是 "GET /file.txt HTTP/1.1" , 但是上面測試如果用 "GET /nasf/images/tops.gif HTTP/1.1" 命令第一次就會失敗
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
agogorz
初階會員 發表:9 回覆:34 積分:28 註冊:2005-04-09 發送簡訊給我 |
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
補上小弟抓到範例的測試情況
軟體 : Delphi 2007 for Win32 Enterprise Indy Demos 網頁有 TIdTCPClient/Server with SSL 範例 http://www.indyproject.org/Sockets/Demos/index.EN.aspx 或直接去下面網頁下載 Indy10SSLExample.zip http://adg.bmpcoe.org/IndySSL/ (這裡也有 Indy9SSLExample.zip , 小弟沒去測試) 然後去下載 indy_OpenSSL096m.zip http://indy.fulgan.com/SSL/ 將解壓縮產生 libeay32.dll 和 ssleay32.dll 放到 Indy10SSLExample.zip 解壓縮產生的目錄中 用 Delphi 開啟 sslServer10.dpr , 編譯執行 另外執行一個 Delphi 開啟 sslClient10.dpr , 編譯執行, 按下 Connect, 就會看到 Memo 出現 Hello , 表示連線傳輸成功 PS: 如果您的 Indy 10 是另外安裝的, 請注意原始程式碼檔案上方說明修改環境設定 In order to compile the application, you'll have to add the Indy 10 source folders to the Project/Options/Directories-Conditionals/Search Path; e.g: C:\Indy10\Lib\Core;C:\Indy10\Lib\System;C:\Indy10\Lib\Protocols
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
編輯記錄
pcboy 重新編輯於 2007-07-27 12:08:15, 註解 無‧
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
參考這篇(沒有完整範例)
http://www.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_22020179.html#a17719996 寫了個小程式, 執行到 IdHTTP1.Get 就停住了, 有人知道該如何改嗎? <textarea class="delphi" rows="10" cols="60" name="code">procedure TForm1.FormCreate(Sender: TObject); var FileName: String; SSLIOHandler: TIdSSLIOHandlerSocketBase; begin FileName:='tops.gif'; SSLIOHandler:= TIdSSLIOHandlerSocketBase.Create; try IdHTTP1.IOHandler:= SSLIOHandler; Dir:=ExtractFileDir(Application.Exename) FileName; fs := TFileStream.Create(Dir, fmCreate); IdHTTP1.Get('https://nas.immigration.gov.tw/nasf/images/tops.gif' , fs); finally fs.Free; SSLIOHandler.Free; end; end; </textarea>
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
編輯記錄
pcboy 重新編輯於 2007-07-27 12:12:34, 註解 無‧
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
1.不能寫在FormCreate裡面,此時Form本身還在初始化,位於其上的元件根本都還沒開始Initial,是無法使用他們的方法的,把這些程式碼重新放在Create之後,例如:只有一個主Form的話可以放在Show裡面,其他狀況請類推。
2.不要忘記把Indy_openssl的兩個SSL library(libeay32.dll,ssleay32.dll)放在系統目錄之中! 3.以下的程式碼我測試無誤,我沒有TIdSSLIOHandlerSocketBase,我用TIdSSLIOHandlerSocket做的! <textarea cols="60" rows="10" class="delphi" name="code"> procedure TForm1.FormShow(Sender: TObject); var FileName, Dir: String; SSLIOHandler: TIdSSLIOHandlerSocket; fs:tfilestream; begin FileName:='tops.gif'; SSLIOHandler:= TIdSSLIOHandlerSocket.Create(self); try IdHTTP1.IOHandler:= SSLIOHandler; Dir :=ExtractFileDir(Application.Exename) FileName; fs := TFileStream.Create(Dir, fmCreate); IdHTTP1.Get('https://nas.immigration.gov.tw/nasf/images/tops.gif' , fs); finally fs.Free; SSLIOHandler.Free; end; end; </textarea>
編輯記錄
Stallion 重新編輯於 2007-07-28 20:58:44, 註解 加入一些話語程式碼~‧
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
感謝 ~ 找機會實際測試看看 Delphi 2006/2007 沒有 TIdSSLIOHandlerSocket TIdSSLIOHandlerSocketBase 好像不是 VCL 元件, 當你放上某些 VCL元件時候, uses 自動會多出 TIdSSLIOHandlerSocketBase Delphi 7 Enterprise Indy I/O Handlers : TIdIOHandlerSocket, TIdIOHandlerStream, TIdIOHandlerThrottle, TIdServerIOHandlerSocket, TIdServerIOHandlerSSL, TIdSSLIOHandlerSocket1 Delphi 2006/2007 Enterprise Indy I/O Handlers : TIdIOHandlerStack, TIdIOHandlerStream, TIdServerIOHandlerStack, TIdServerIOHandlerSSLOpenSSL, TIdSSLIOHandlerSocketOpenSSL
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
> .不能寫在FormCreate裡面,此時Form本身還在初始化,位於其上的元件根本都還沒開始Initial,是無法使用他們的方法的
請問下面為何可以執行 ??? <textarea class="delphi" rows="10" cols="60" name="code"> procedure TForm1.FormCreate(Sender: TObject); begin Button1.Click; end; procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Lines.Add('test'); end;</textarea>
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
Stallion 兄的在 Delphi 7 Enterprise 測試過確實可用, 檔案可以下載
Dir:=ExtractFileDir(Application.Exename) FileName; 要改為 (這是小弟的程式就開始寫錯了) Dir :=ExtractFileDir(Application.Exename) '/' FileName;
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
小弟又換了元件做了些測試, 還是失敗, 列於下面, 看看是否有助於大家幫忙看出問題
<textarea class="delphi" rows="10" cols="60" name="code"> // 程式 : 透過 HTTPS 下載檔案 // 開發工具 : Delphi 7 Enterprise 成功 // 開發工具 : Delphi 2007 Enterprise 失敗, 測試中 // 程式庫 : 要去 http://indy.fulgan.com/SSL/ 下載 indy_OpenSSL096m.zip // 解壓縮後放在本目錄 // 元件 : 請放 Indy Clients 元件板的 TIdHTTP (Delphi 7,2007同) // Indy I/O Handlers 元件板的 TIdSSLIOHandlerSocket (Delphi 7 , 但 Delphi 2007 改了) unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdIOHandler, IdIOHandlerSocket, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, IdSSLOpenSSL, IdSSL, IdServerIOHandler, IdServerIOHandlerSocket, IdServerIOHandlerStack, IdIOHandlerStream, IdIOHandlerStack; type TForm1 = class(TForm) IdHTTP1: TIdHTTP; IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL; IdIOHandlerStack1: TIdIOHandlerStack; IdIOHandlerStream1: TIdIOHandlerStream; IdServerIOHandlerStack1: TIdServerIOHandlerStack; IdServerIOHandlerSSLOpenSSL1: TIdServerIOHandlerSSLOpenSSL; procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormShow(Sender: TObject); var FileName, Dir: String; // SSLIOHandler: TIdSSLIOHandlerSocket; // Delphi 7 // SSLIOHandler: TIdSSLIOHandlerSocketOpenSSL; // Delphi 2007 // SSLIOHandler: TIdIOHandlerStack; // Delphi 2007 // SSLIOHandler: TIdIOHandlerStream; // Delphi 2007 // SSLIOHandler: TIdServerIOHandlerSSLOpenSSL; // Delphi 2007 SSLIOHandler: TIdSSLIOHandlerSocketBase; // Delphi 2007 fs:tfilestream; begin FileName:='tops.gif'; // SSLIOHandler:= TIdSSLIOHandlerSocket.Create(self); // Delphi 7 // SSLIOHandler:= TIdSSLIOHandlerSocketOpenSSL.Create(self); // Delphi 2007 // SSLIOHandler:= TIdIOHandlerStack.Create(self); // Delphi 2007 // SSLIOHandler:= TIdIOHandlerStream.Create(self); // Delphi 2007 // SSLIOHandler:= TIdServerIOHandlerStack.Create(self); // Delphi 2007 // SSLIOHandler:= TIdServerIOHandlerSSLOpenSSL.Create(self); // Delphi 2007 SSLIOHandler:= TIdSSLIOHandlerSocketBase.Create(self); // Delphi 2007 try IdHTTP1.IOHandler:= SSLIOHandler; Dir :=ExtractFileDir(Application.Exename) '/' FileName; fs := TFileStream.Create(Dir, fmCreate); IdHTTP1.Get('https://nas.immigration.gov.tw/nasf/images/tops.gif' , fs); { Delphi 7 的TIdSSLIOHandlerSocket 在 Delphi 2007 改用 TIdIOHandlerStack , 執行到 IdHTTP1.Get 錯誤訊息 Project Project1.exe raised exception class EIdIOHandlerPropInvalid with message 'IOHander value is not valid'. 改用 TIdSSLIOHandlerSocketOpenSSL , 執行到 IdHTTP1.Get 錯誤訊息 Project Project1.exe raised exception class EIdReadTimeout with message 'Read Timeout'. 改用 TIdIOHandlerStream , 執行到 IdHTTP1.Get 錯誤訊息 Project Project1.exe raised exception class EIdIOHandlerPropInvalid with message 'IOHandler value is not valid'. 改用 TIdServerIOHandlerStack , 編譯到 SSLIOHandler:= TIdServerIOHandlerStack.Create(self) 錯誤訊息 [DCC Error] Unit1.pas(56): E2010 Incompatible types: 'TIdIOHandlerStream' and 'TIdServerIOHandlerStack' 改用 TIdServerIOHandlerSSLOpenSSL, 編譯到 IdHTTP1.IOHandler:= SSLIOHandler; 錯誤訊息 [DCC Error] Unit1.pas(62): E2010 Incompatible types: 'TIdIOHandler' and 'TIdServerIOHandlerSSLOpenSSL' 改用 TIdSSLIOHandlerSocketBase, 執行到 IdHTTP1.Get 錯誤訊息 (要等一陣子) Project Project1.exe raised exception class EIdIOSocketError with message 'Socket Error # 10054 Connection reset by peer.'. Compile 有 3 行警告, 不知是否有助於找出問題 [DCC Warning] Unit1.pas(65): W1020 Constructing instance of 'TIdSSLIOHandlerSocketBase' containing abstract method 'TIdSSLIOHandlerSocketBase.Clone' [DCC Warning] Unit1.pas(65): W1020 Constructing instance of 'TIdSSLIOHandlerSocketBase' containing abstract method 'TIdSSLIOHandlerSocketBase.StartSSL' [DCC Warning] Unit1.pas(93): W1036 Variable 'fs' might not have been initialized } finally fs.Free; SSLIOHandler.Free; end; end; end. </textarea>
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |