線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:10505
推到 Plurk!
推到 Facebook!

請問如何下載 HTTPS://xxx.xx 的檔案

缺席
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-07-27 10:21:50 IP:61.220.xxx.xxx 訂閱
請問如何下載 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
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
附加檔案:46a956be45c99_SSLtest.zip
編輯記錄
pcboy 重新編輯於 2007-07-30 14:13:43, 註解 無‧
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-07-27 10:32:04 IP:61.220.xxx.xxx 訂閱
執行測試情況:
執行後, 第一次按下 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" 命令第一次就會失敗
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
編輯記錄
pcboy 重新編輯於 2007-07-27 10:32:34, 註解 無‧
pcboy 重新編輯於 2007-07-27 10:33:35, 註解 無‧
agogorz
初階會員


發表:9
回覆:34
積分:28
註冊:2005-04-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-07-27 12:00:49 IP:59.124.xxx.xxx 訂閱
請問版本是哪版,用DELPHI5-7開都會有元件出問題
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-07-27 12:07:36 IP:61.220.xxx.xxx 訂閱
補上小弟抓到範例的測試情況
軟體 : 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-07-27 12:12:08 IP:61.220.xxx.xxx 訂閱
參考這篇(沒有完整範例)
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-07-28 20:49:41 IP:211.22.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-07-29 07:45:51 IP:203.204.xxx.xxx 訂閱
感謝 ~ 找機會實際測試看看
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-07-30 10:05:06 IP:61.220.xxx.xxx 訂閱
> .不能寫在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 重新編輯於 2007-07-30 10:05:39, 註解 無‧
pcboy 重新編輯於 2007-07-30 10:07:01, 註解 無‧
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-07-30 10:08:46 IP:61.220.xxx.xxx 訂閱
Stallion 兄的在 Delphi 7 Enterprise 測試過確實可用, 檔案可以下載
Dir:=ExtractFileDir(Application.Exename) FileName;
要改為 (這是小弟的程式就開始寫錯了)
Dir :=ExtractFileDir(Application.Exename) '/' FileName;
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-07-30 10:13:50 IP:61.220.xxx.xxx 訂閱
小弟又換了元件做了些測試, 還是失敗, 列於下面, 看看是否有助於大家幫忙看出問題

<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>
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
系統時間:2024-04-29 1:18:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!