一个连接有重定向
比如www.xxx.com/123.php?name=aaa如何获得最后实际下载文件的扩展名

解决方案 »

  1.   

    看MSDN好象是取不到跳转后的文件名
      

  2.   

    我随便找了个下载站的链接
    http://www.zhaodll.com/dll/download.asp?softid=662&downid=29&id=660最后实际文件是个rar文件,我想在不下载的前提下获取文件名,比如这个连接的文件名就是urlmon.rar
      

  3.   

    1 www.zhaodll.com|
    2 211.191.183.19|
    11 |
    38 |
    3 http://z2.zhaodll.com:808/urlmon.rar|
    1 z2.zhaodll.com|
    2 60.190.222.182|
    11 |
    13 application/octet-stream|
    4 http://z2.zhaodll.com:808/urlmon.rar|
    14 C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files\Content.IE5\ONP0HA2Z\urlmon[1].rar|
    5 http://z2.zhaodll.com:808/urlmon.rar|
    6 http://z2.zhaodll.com:808/urlmon.rar|这是我截获的所有数据,名称是urlmon.rar吗?
      

  4.   

    是urlmon.rar了,我昨天用ICS组件试了下,有个Head方法可以获得跳转后的地址,然后提出文件名即可不知道你用的是什么办法?
      

  5.   

    直接用的UrlDownloadToFile,在最后一个接口里面截取的信息。简单写写,你看看unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, UrlMon, ActiveX, StdCtrls, ComCtrls, ExtCtrls;type
      TForm1 = class(TForm, IBindStatusCallback)
        pb: TProgressBar;
        Button1: TButton;
        Label1: TLabel;
        Label2: TLabel;
        Button2: TButton;
        Label3: TLabel;
        Timer1: TTimer;
        Memo1: TMemo;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
        function OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult; stdcall;
        function GetPriority(out nPriority): HResult; stdcall;
        function OnLowResource(reserved: DWORD): HResult; stdcall;
        function OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG;
          szStatusText: LPCWSTR): HResult; stdcall;
        function OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall;
        function GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall;
        function OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc;
          stgmed: PStgMedium): HResult; stdcall;
        function OnObjectAvailable(const iid: TGUID; punk: IUnknown): HResult; stdcall;
      public
        { Public declarations }
        DownloadProgress: Integer;
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TForm1 }uses
      Unit2;var
      stemp: String;function TForm1.GetBindInfo(out grfBINDF: DWORD;
      var bindinfo: TBindInfo): HResult;
    begin
      result := E_NOTIMPL;
    end;function TForm1.GetPriority(out nPriority): HResult;
    begin
      result := E_NOTIMPL;
    end;function TForm1.OnDataAvailable(grfBSCF, dwSize: DWORD;
      formatetc: PFormatEtc; stgmed: PStgMedium): HResult;
    begin
      result := E_NOTIMPL;
    end;function TForm1.OnLowResource(reserved: DWORD): HResult;
    begin
      result := E_NOTIMPL;
    end;function TForm1.OnObjectAvailable(const iid: TGUID;
      punk: IInterface): HResult;
    begin
      result := E_NOTIMPL;
    end;function TForm1.OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG;
      szStatusText: LPCWSTR): HResult;
    begin
      if ulStatusCode = 4 then
      begin
        ShowMessage(szStatusText);
        result := E_ABORT ;
      end
      else
        result := E_NOTIMPL;
    end;function TForm1.OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult;
    begin
      result := E_NOTIMPL;
    end;function TForm1.OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult;
    begin
      result := E_NOTIMPL;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      td: TUrlDownload;
    begin
      stemp := '';
      td := TUrlDownload.Create(false) ;
    end;end.------------------------------------------
    unit Unit2;interfaceuses
      Classes, UrlMon;type
      TUrlDownload = class(TThread)
      private
        { Private declarations }
      protected
        procedure Execute; override;
      end;implementation{ Important: Methods and properties of objects in visual components can only be
      used in a method called using Synchronize, for example,      Synchronize(UpdateCaption);  and UpdateCaption could look like,    procedure TUrlDownload.UpdateCaption;
        begin
          Form1.Caption := 'Updated in a thread';
        end; }{ TUrlDownload }uses
      Unit1;procedure TUrlDownload.Execute;
    begin
      { Place thread code here }
      UrlDownloadToFile(nil, PChar(form1.Edit1.Text), PChar(form1.Edit2.Text), 0, form1);
    end;end.窗体上1个button,2个editedit1里面是要下载的地址,edit2里面是要保存的路径,
    在OnProgress里面获得要下载的真正地址。