WinInet 下载文件示例

 

Uses WinInet
(1)HTTP下载
Function WWWDownFile(Const FTURL,LocalFile : String) : Boolean; //下载函数.
Const
  FTAcceptTypes = '*/*';
  FTAgent = 'Explorer';
  FTUserName = '';                    //用户名.
  FTPassword = '';                    //密码.
  FTPort = 80;                       //端口.
  FTPostQuery = 'GET';
  FTReferer = '';

Var
  hSession, hConnect, hRequest: hInternet;
  HostName, FileName: String;
  f: File;
  Buf: Pointer;
  dwBufLen, dwIndex: DWord;
  Data: Array[0..$400] of Char;
  RequestMethod: PChar;
  InternetFlag: DWord;
  TimeOut : Cardinal;
  AcceptType: LPStr;
  BytesToRead,BytesReaded : DWord;
  FTFileSize : integer;
 
  Procedure ParseURL(URL: String; var HostName, FileName: String);
  Var
    i: Integer;
  Begin
    if Pos('http://', LowerCase(URL)) <> 0 then
      System.Delete(URL, 1, 7);

    i := Pos('/', URL);
    HostName := Copy(URL, 1, i);
    FileName := Copy(URL, i, Length(URL) - i + 1);
    if (Length(HostName) > 0) and (HostName[Length(HostName)] = '/') then
      SetLength(HostName, Length(HostName) - 1);
  End;

  Procedure CloseHandles;
  begin
   InternetCloseHandle(hRequest);
   InternetCloseHandle(hConnect);
   InternetCloseHandle(hSession);
  end;

begin
  TimeOut := 6000000;
  ParseURL(FTURL, HostName, FileName);
  RequestMethod := PChar(FTPostQuery); // 'GET'
  InternetFlag := 0;
  AcceptType := PChar('Accept: ' + FTAcceptTypes);

  if FTAgent <> '' then
    hSession := InternetOpen(PChar(FTAgent),
                INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0)
  else
    hSession := InternetOpen(nil,
                INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

  hConnect := InternetConnect(hSession, PChar(HostName),
              FTPort, PChar(FTUserName), PChar(FTPassword),
              INTERNET_SERVICE_HTTP, 0, 0);
  hRequest := HttpOpenRequest(hConnect, RequestMethod, PChar(FileName), 'HTTP/1.1',
              PChar(FTReferer), @AcceptType, InternetFlag, 0);
  InternetSetOption(hRequest, INTERNET_OPTION_CONNECT_TIMEOUT,
                                 @TimeOut, SizeOf(TimeOut));
  InternetSetOption(hRequest, INTERNET_OPTION_DATA_RECEIVE_TIMEOUT,
                                 @TimeOut, SizeOf(TimeOut));


  if FTPostQuery = '' then
    HttpSendRequest(hRequest, nil, 0, nil, 0)
  else
    HttpSendRequest(hRequest, 'Content-Type: application/x-www-form-urlencoded', 47,
                    PChar(FTPostQuery), Length(FTPostQuery));

  dwIndex  := 0;
  dwBufLen := 1024;
  GetMem(Buf, dwBufLen);

  Result := HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH,
                            Buf, dwBufLen, dwIndex);

  if Result then begin
    BytesReaded := 0;
    FTFileSize := StrToInt(StrPas(Buf));
    AssignFile(f, LocalFile);
    Rewrite(f, 1);
    while True do begin
       if not InternetReadFile(hRequest, @Data, SizeOf(Data), BytesToRead) then
         break
       else if BytesToRead = 0 then Break
       else
         BlockWrite(f, Data, BytesToRead);
       BytesReaded := BytesReaded + BytesToRead;
     End;
     Result := FTFileSize = Integer(BytesReaded);
     CloseFile(f);
  End;
  FreeMem(Buf);
  CloseHandles;
end;

(2)FTP下载
function  TForm1.GetList(ip:string):bool;     //得到远程抓拍机内的文件名列表
var
    hNet, hFTP,hFind: HINTERNET;
    bSuccess: Boolean;
    FindData: TWin32FindData;
    str:Tstrings    ;
begin
    //timer1.Enabled:=true;
    //control := true;
    hNet := InternetOpen('Program_Name', // Agent
                        INTERNET_OPEN_TYPE_PRECONFIG, // AccessType
                        nil,  // ProxyName
                        nil, // ProxyBypass
                        0); // or INTERNET_FLAG_ASYNC / INTERNET_FLAG_OFFLINE
    if hNet = nil then
    begin
        memo1.Lines.Add('缺少动态连接库WinInet.Dll!');
        Result := False;
        Exit;
    end;


    timer1.Enabled:=true;
    application.ProcessMessages();
    { Connect to the FTP Server }
    hFTP := InternetConnect(hNet, // Handle from InternetOpen
                          pchar('192.168.0.253'), // FTP server
                          21, // (INTERNET_DEFAULT_FTP_PORT),
                          PChar('root'), // username
                          PChar(''),  // password
                          INTERNET_SERVICE_FTP, // FTP, HTTP, or Gopher?
                          0, // flag: 0 or INTERNET_FLAG_PASSIVE
                          255);// User defined number for callback
    if hFTP = nil then
    begin
        InternetCloseHandle(hNet);
        memo1.Lines.Add('连接'+ip+'成功!准备开始下载!');
        Result := False;
        Exit;
    end;
    timer1.Enabled :=false;

    { Change directory }
      //timer1.Enabled:=true;
    bSuccess := FtpSetCurrentDirectory(hFTP, PChar('/mnt/imagefolder'));
    if not bSuccess then
    begin
        InternetCloseHandle(hFTP);
        InternetCloseHandle(hNet);
        memo1.Lines.Add('操作抓拍机错误,请检查!');
        Result := False;
        Exit;
    end;
    timer1.Enabled:=false;

    hFind:= FtpFindFirstFile(hFtp, '*.jpg',FindData, 0, 0);
    if hFind = nil then
    begin
        memo1.lines.add('抓拍机内暂无图片!');
        InternetCloseHandle(hFTP);
        InternetCloseHandle(hNet);
        Result:=false;
        Exit;
    end;

    str:=tstringlist.Create;
    str.Clear;
    while InternetFindnextFile(hFind, @FindData)  do
    begin
        str.Add(FindData.cfilename);
    end;

    InternetCloseHandle(hFind);
    InternetCloseHandle(hFTP);
    InternetCloseHandle(hNet);
    Result := true;

end;

function TForm1.download(ReFile,LoFile,ip:string):Bool;
var
   Hnet,Hftp:HINTERNET;
   bSuccess: Boolean;
   bGetFile: Boolean;
begin
    hNet := InternetOpen('Program_Name', // Agent
                        INTERNET_OPEN_TYPE_PRECONFIG, // AccessType
                        nil,  // ProxyName
                        nil, // ProxyBypass
                        0); // or INTERNET_FLAG_ASYNC / INTERNET_FLAG_OFFLINE
    if hNet = nil then
    begin
        memo1.Lines.Add('缺少动态连接库WinInet.Dll!');
        Result := False;
        Exit;
    end;

    { Connect to the FTP Server }
    hFTP := InternetConnect(hNet, // Handle from InternetOpen
                          PChar(ip), // FTP server
                          21, // (INTERNET_DEFAULT_FTP_PORT),
                          PChar('root'), // username
                          PChar(''),  // password
                          INTERNET_SERVICE_FTP, // FTP, HTTP, or Gopher?
                          INTERNET_FLAG_PASSIVE, // flag: 0 or INTERNET_FLAG_PASSIVE
                          0);// User defined number for callback
    if hFTP = nil then
    begin
        InternetCloseHandle(hNet);
        memo1.Lines.add(ip+'不存在!');
        Result := False;
        Exit;
    end;

    { Change directory }
    bSuccess := FtpSetCurrentDirectory(hFTP, PChar('/mnt/imagefolder'));
    if not bSuccess then
    begin
        InternetCloseHandle(hFTP);
        InternetCloseHandle(hNet);
        memo1.Lines.Add('操作错误,请检查!');
        Result := False;
        Exit;
    end;

    memo1.Lines.Add('正在下载!'+ReFile);
    bGetFile:=ftpgetfile(hftp,
               PChar(ReFile),
               pchar(LoFile),
               false,
               File_Attribute_Normal,
               Ftp_Transfer_Type_Binary,
               0);
    if not bGetFile then
    begin
        memo1.Lines.Add(ReFile+'下载失败!');
        inc(ErrNum);
        InternetCloseHandle(hFTP);
        InternetCloseHandle(hNet);
        Result:=False;
        Exit;
    end;

    memo1.lines.add(ReFile+'下载成功!');
    sleep(20);
    InternetCloseHandle(hFTP);
    InternetCloseHandle(hNet);
end;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
把.h文件里面的代码放出来一下,CPP就不放了,自己下载哦。 #ifndef Download_h__ #define Download_h__ #include <wininet.h> #pragma comment(lib,"wininet.lib") class CHttpGet { public: //测试网络是否连接成功。 BOOL TestNetworkIsConnected(); //动态获取URL文件名。 //LPCTSTR szURL URL地址 //LPSTR pFileName 文件名缓冲区,获取到文件名后,会文件名放入到该buffer //DWORD dwBufferOfLenght pFileName缓冲区大小。 //pResult 是否成功。 BOOL HttpGetFileName(LPCTSTR szURL,LPSTR pFileName,DWORD dwBufferOfLenght,BOOL * pResult); //将文件下载到缓冲区,而不是保存到文件 //szURL URL地址 //szBuffer 缓冲区。 //dwSize 缓冲区大小 //lpdwSizeOfRet实际下载到的数据大小。 DWORD URLDownloadToBuffer(LPCTSTR szURL,LPBYTE szBuffer,DWORD dwSize,DWORD *lpdwSizeOfRet); //下载文件 //szURL URL地址 //szFileSavePath 文件完整保存路径 // CheckFileTypeIsPe 是否需要检测文件是不是PE文件。 DWORD URLDownloadToFile(LPCTSTR szURL,LPCTSTR szFileSavePath,BOOL CheckFileTypeIsPe); }; #endif // Download_h__ CPP部分代码,详细自己下载。 完全原创。代码注释详细。 使用及其方便... DWORD CHttpGet::URLDownloadToFile(LPCTSTR szURL,LPCTSTR szFileSavePath,BOOL CheckFileTypeIsPe) { if(!CheckUrl(szURL)) return FALSE; HINTERNET hInternetOpen = InternetOpen( "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)", INTERNET_OPEN_TYPE_PRECONFIG,/*返回注册表中代理或直接的配置*/ NULL,//不使用代理 所以不要设置用户名 NULL,//不使用代理 所以不用设置密码 NULL ); if(hInternetOpen == NULL) return FALSE; HINTERNET hInternetUrl = InternetOpenUrl( hInternetOpen, szURL, "Accept: */*",//支持左所有文件 -1, INTERNET_FLAG_RELOAD|INTERNET_FLAG_PRAGMA_NOCACHE,/*不要从缓冲里面获取数据 */ NULL); if(hInternetUrl == NULL) return FALSE; CHAR szStatus[1024]={NULL}; DWORD dwBufferLen = sizeof(szStatus); //查询状态 HttpQueryInfo(hInternetUrl,HTTP_QUERY_STATUS_CODE,szStatus,&dwBufferLen;,NULL); //4xx(请求错误) DWORD dwCode = atoi(szStatus); if( dwCode > 400 && dwCode < 500) return FALSE; //5xx(服务器错误) if( dwCode >500 && dwCode < 600) return FALSE; //开始下载文件 HANDLE hFile = CreateFile(szFileSavePath,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); if(hFile == INVALID_HANDLE_VALUE) { InternetCloseHandle(hInternetUrl); InternetCloseHandle(hInternetOpen); return FALSE; } CHAR szReadBuffer[4096]={NULL}; DWORD dwInternetReadOfByte = 0; DWORD dwWriteByte = 0; BOOL bFirst = FALSE; BOOL bResult = TRUE; do { BOOL bRet = InternetReadFile(hInternetUrl,szReadBuffer,sizeof(szReadBuffer),&dwInternetReadOfByte;); //说明文件传送完了。 if(bRet == TRUE && dwInternetReadOfByte == 0) break; if(bFirst == FALSE && CheckFileTypeIsPe==TRUE) { bFirst = TRUE; if(((PIMAGE_DOS_HEADER)szReadBuffer)->e_magic!= IMAGE_DOS_SIGNATURE) { bResult = FALSE; break; } } WriteFile(hFile,szReadBuffer,dwInternetReadOfByte,&dwWriteByte;,NULL); } while (TRUE); CloseHandle(hFile); InternetCloseHandle(hInternetUrl); InternetCloseHandle(hInternetOpen); return bResult; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值