Jak pobrać URL pobieranego pliku w Webbrowser ?

0

Po kliknięciu w button rozpoczyna się pobieranie pliku w Webbrowserze.
W jaki sposób mogę pobrać adres "aktualnie pobieranego pliku" z WebBrowsera ?
@kAzek

0

Nie rozumiem... czy w WebBrowser jest wyświetlana jakaś strona na której jest button i który klikasz aby zacząć pobieranie pliku i chcesz się dowiedzieć jaki plik pobierasz?

0

chodzi o to że stronka jest np taka:

www.mojastrona.pl
i na niej jest button, lecz po kliknięciu na button plik jest pobierany zamiast z:
mojastrona.pl
to np z jakiegoś IP typu:

68.543.12.88/plik.rar

i ja chce pobrać właśnie to IP, wraz z całą ścieżką do pliku...

czyli chce znać adres "aktualnie pobieranego pliku"...

sam button nie ma w sobie schowanego linku, gdyż podmienia link jakiś skrypt w JAVA

0

Java nie ma nic wspólnego z JavaScriptem.

0

tak czy inaczej chciałbym pobrać link do pliku z wyskakującego okienka zapisu/otwarcia pliku
@kAzek

0

W "normalnym" WebBrowser się nie da... ale obczaj to:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, SHDocVw, ActiveX, MSHTML, UrlMon;

const
  IID_IDownloadManager: TGUID = '{988934A4-064B-11D3-BB80-00104B35E7F9}';
  SID_SDownloadManager: TGUID = '{988934A4-064B-11D3-BB80-00104B35E7F9}';

type
  IDownloadManager = interface(IUnknown)
    ['{988934A4-064B-11D3-BB80-00104B35E7F9}']
    function Download(pmk: IMoniker; pbc: IBindCtx; dwBindVerb: DWORD;
      grfBINDF: DWORD; pBindInfo: PBindInfo; pszHeaders: PWideChar;
      pszRedir: PWideChar; uiCP: UINT): HRESULT; stdcall;
  end;
  TBeforeFileDownloadEvent = procedure(Sender: TObject; const FileSource: WideString;
    var Allowed: Boolean) of object;
  TWebBrowser = class(SHDocVw.TWebBrowser, IServiceProvider, IDownloadManager)
  private
    FFileSource: WideString;
    FOnBeforeFileDownload: TBeforeFileDownloadEvent;
    function QueryService(const rsid, iid: TGUID; out Obj): HRESULT; stdcall;
    function Download(pmk: IMoniker; pbc: IBindCtx; dwBindVerb: DWORD;
      grfBINDF: DWORD; pBindInfo: PBindInfo; pszHeaders: PWideChar;
      pszRedir: PWideChar; uiCP: UINT): HRESULT; stdcall;
  protected
    procedure InvokeEvent(ADispID: TDispID; var AParams: TDispParams); override;
  published
    property OnBeforeFileDownload: TBeforeFileDownloadEvent read FOnBeforeFileDownload write FOnBeforeFileDownload;
  end;


  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure BeforeFileDownload(Sender: TObject; const FileSource: WideString; var Allowed: Boolean);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
{ TWebBrowser }

function TWebBrowser.Download(pmk: IMoniker; pbc: IBindCtx; dwBindVerb,
  grfBINDF: DWORD; pBindInfo: PBindInfo; pszHeaders, pszRedir: PWideChar;
  uiCP: UINT): HRESULT;
var
  Allowed: Boolean;
begin
  Result := E_NOTIMPL;
  if Assigned(FOnBeforeFileDownload) then
  begin
    Allowed := True;
    if pszRedir <> '' then
      FFileSource := pszRedir;
    FOnBeforeFileDownload(Self, FFileSource, Allowed);
    if not Allowed then
      Result := S_OK;
  end;
end;

procedure TWebBrowser.InvokeEvent(ADispID: TDispID; var AParams: TDispParams);
begin
  inherited;
  if ADispID = 250 then
    FFileSource := OleVariant(AParams.rgvarg^[5]);
end;

function TWebBrowser.QueryService(const rsid, iid: TGUID; out Obj): HRESULT;
begin
  Result := E_NOINTERFACE;
  Pointer(Obj) := nil;
  if Assigned(FOnBeforeFileDownload) and IsEqualCLSID(rsid, SID_SDownloadManager) and
    IsEqualIID(iid, IID_IDownloadManager) then
  begin
    if Succeeded(QueryInterface(IID_IDownloadManager, Obj)) and
      Assigned(Pointer(Obj))
    then
      Result := S_OK;
  end;
end;

{TForm}

procedure TForm1.BeforeFileDownload(Sender: TObject; const FileSource: WideString;
  var Allowed: Boolean);
begin
   //tu masz nazwe pliku, mozesz tez zablokowac pobieranie
   if Application.MessageBox(PAnsiChar('Czy pozwolic na pobranie pliku: ' + string(FileSource)),
        nil, MB_ICONQUESTION or MB_YESNO) <> IDYES then
     Allowed:= False;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  WebBrowser1.OnBeforeFileDownload := BeforeFileDownload;
  WebBrowser1.Navigate('http://7-zip.org.pl/');
end;

end.

To dodaje dodatkowe zdarzenie OnBeforeFileDownload gdzie jako jeden z parametrów masz ścieżkę do pobieranego pliku, nawet na Twoje potrzeby można by tu skrócić nawet wyciąć IDownloadManager ale po co tak daje większe możliwości i jest to zrobione ładniej.

PS: Kod implementacji IDownloadManager nie jest mój tylko znaleziony jakiś czas temu nawet nie pamiętam gdzie.

EDIT:
Teraz zobaczyłem że to ma być w vb.NET... no niestety nie umiem przetłumaczyć tego na VB chyba że ktoś inny to przetłumaczy...

0

zlecę napisanie takiego programu

0

Nie napisałeś podstawowej informacji - ile płacisz?

1 użytkowników online, w tym zalogowanych: 0, gości: 1