Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Datei-Download per webview2/TEdgeBrowser (https://www.delphipraxis.net/210200-datei-download-per-webview2-tedgebrowser.html)

gabneo 16. Mär 2022 15:42

Delphi-Version: 10.4 Sydney

Datei-Download per webview2/TEdgeBrowser
 
Hallo,
in einem Projekt prüfen wir ob ein Wechsel von cef3 auf Edge möglich wäre.
Da die Anwendung auch Dateien herunterladen und gezielt ablegen können soll, suche ich nach einem Weg das zu tun.

Hier mal mein versuchter Weg das über WebResourceRequested umzusetzen:

Code:
procedure Tdownload.EdgeBrowser1WebResourceRequested(Sender: TCustomEdgeBrowser; Args: TWebResourceRequestedEventArgs);
var request: ICoreWebView2WebResourceRequest;
    requestURI, responseHeaders, method: PWideChar;
    response: ICoreWebView2WebResourceResponse;
    requestFilename, localFilename, payload: string;
    headers: ICoreWebView2HttpRequestHeaders;
    requestStringStream, : IStream;
    core:ICoreWebView2;
    sett:ICoreWebView2Settings;
begin
  Args.ArgsInterface.Get_Request(request);
  request.Get_uri(requestURI); //kann man sich anschauen wenn man will :)

  //Teile dem Server ein paar Infos über mich mit
  request.Get_Headers(headers);
  headers.SetHeader('User-Agent', PChar('TestBrowserDownload v' + GetVersion));
  headers.SetHeader('Content-Type', PChar('application/x-www-form-urlencoded'));
  request.Set_Method('POST');
  payload := 'a=textusw';
  requestStringStream := TStreamAdapter.Create(TStringStream.Create(payload, TEncoding.UTF8), soOwned);
  request.Set_Content(requestStringStream);
 
  //Versuch IStream für den Dateitransfer zur Verfügung zu stellen...
  Args.ArgsInterface.Get_Response(response);
  requestFileStream := TStreamAdapter.Create(TFileStream.Create(extractfilepath(paramstr(0)) + 'test.dat', fmCreate or fmOpenReadWrite or fmShareDenyNone), soOwned);
  response.Set_Content(requestFileStream);
end;
Er kann die Datei zwar anlegen, danach kommt aber eine Zugriffsverletzung auf 0x00000000. Meine Vermutung ist, dass IStream zum Zeitpunkt des hineinschreibens bereits freigegeben worden ist.
Was mache ich hier falsch?

Alternativ gibt es laut Microsoft-Doku (https://docs.microsoft.com/en-us/dot...et-1.0.1150.38) wohl ein "DownloadStarting" Event, mit dem ich das auch machen könnte. Das ist leider aber nicht in der WebView2.pas gekapselt worden (ich kenne also das Interface nicht und kann auch mit Interfaces noch nicht so richtig).

Viele Grüße

Der schöne Günther 17. Mär 2022 06:56

AW: Datei-Download per webview2/TEdgeBrowser
 
Ich kann nur ganz allgemein empfehlen sich die Rückgabewerte (von z.B. put_content) anzusehen, nicht dass dem schon etwas nicht schmeckt.

Und ganz dumme Idee: Nicht dass
Delphi-Quellcode:
response
einfach nur
Delphi-Quellcode:
nil
war?

gabneo 17. Mär 2022 08:51

AW: Datei-Download per webview2/TEdgeBrowser
 
Das werde ich bei nächster Gelegenheit überprüfen. Danke schon mal für die Ideen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz