2016-06-13 2 views
-3

Я использую TChromium, и мне нужно перейти к определенной странице и сохранить определенное изображение этой страницы в файл.TChromium: как сохранить определенное изображение в файл?

Я знаю, как перемещаться и извлекать источник HTML, чтобы получить адрес изображения, но я не знаю, как сохранить изображение в локальной файловой системе.

Как это сделать, используя какой-либо метод TChromium?

Я не хочу использовать другой компонент (такой TIdHTTP), чтобы сделать это, потому что сайту требуется логин, а изображение зависит от активного сеанса.

Заранее благодарен!

+1

Это просто команда HTTP GET –

+0

@DavidHeffernan Нет, потому что на изображении показано, что пользователь должен быть зарегистрирован на сайте. Потому что это и другие причины, по которым я хочу использовать TChromium. – delphirules

+3

Пожалуйста, отредактируйте вопрос, чтобы включить эти дополнительные данные. –

ответ

3

С CEF форумов:

«CEF не поддерживает извлечение кэшированных ресурсов Вы можете определить запрос, который первоначально возвращенное содержание по перекрывая CefRequestHandler :: OnBeforeResourceLoad(), а затем выполнить . запрос самостоятельно, используя CefWebURLRequest, извлекает и сохраняет содержимое ».

Другой подход заключается в добавлении контекстное меню, как просили здесь - TChromium how to add "Save Picture" item in Context Menu? и где TLama сделал фрагмент кода:

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls, ExtDlgs, IdHTTP, cefvcl, ceflib; 

const 
    MENU_ID_SAVE_IMAGE_AS = Ord(MENU_ID_USER_FIRST) + 1; 

type 
    TDownloader = class(TThread) 
    private 
    FURL: string; 
    FFileName: string; 
    protected 
    procedure Execute; override; 
    public 
    constructor Create(const URL, FileName: string); reintroduce; 
    end; 

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    Chromium1: TChromium; 
    SavePictureDialog1: TSavePictureDialog; 
    procedure FormCreate(Sender: TObject); 
    procedure Chromium1BeforeContextMenu(Sender: TObject; const browser: ICefBrowser; 
     const frame: ICefFrame; const params: ICefContextMenuParams; const model: ICefMenuModel); 
    procedure Chromium1ContextMenuCommand(Sender: TObject; const browser: ICefBrowser; 
     const frame: ICefFrame; const params: ICefContextMenuParams; commandId: Integer; 
     eventFlags: TCefEventFlags; out Result: Boolean); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

{ TDownloader } 

constructor TDownloader.Create(const URL, FileName: string); 
begin 
    inherited Create(False); 
    FreeOnTerminate := True; 
    FURL := URL; 
    FFileName := FileName; 
end; 

procedure TDownloader.Execute; 
var 
    HTTPClient: TIdHTTP; 
    FileStream: TFileStream; 
begin 
    try 
    HTTPClient := TIdHTTP.Create; 
    try 
     FileStream := TFileStream.Create(FFileName, fmCreate); 
     try 
     HTTPClient.Get(FURL, FileStream); 
     finally 
     FileStream.Free; 
     end; 
    finally 
     HTTPClient.Free; 
    end; 
    except 
    // error handling ignored for this example 
    end; 
end; 

{ TForm1 } 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    Chromium1.Load('http://www.google.com/'); 
end; 

procedure TForm1.Chromium1BeforeContextMenu(Sender: TObject; const browser: ICefBrowser; 
    const frame: ICefFrame; const params: ICefContextMenuParams; const model: ICefMenuModel); 
begin 
    if (CM_TYPEFLAG_MEDIA in params.TypeFlags) and (params.MediaType = CM_MEDIATYPE_IMAGE) then 
    model.AddItem(MENU_ID_SAVE_IMAGE_AS, 'Save image as...'); 
end; 

procedure TForm1.Chromium1ContextMenuCommand(Sender: TObject; const browser: ICefBrowser; 
    const frame: ICefFrame; const params: ICefContextMenuParams; commandId: Integer; 
    eventFlags: TCefEventFlags; out Result: Boolean); 
var 
    SaveDialog: TSavePictureDialog; 
begin 
    if (commandId = MENU_ID_SAVE_IMAGE_AS) then 
    begin 
    SaveDialog := TSavePictureDialog.Create(nil); 
    try 
     // SaveDialog.FileName := <here you can extract file name from params.SourceUrl>; 
     // SaveDialog.DefaultExt := <here you can extract file ext from params.SourceUrl>; 
     if SaveDialog.Execute then 
     TDownloader.Create(params.SourceUrl, SaveDialog.FileName); 
    finally 
     SaveDialog.Free; 
    end; 
    end; 
end; 

end. 

Другой подход заключается в определении всех изображений на странице (обратите внимание на How can I use Javascript to get a list of all picture URLs available on a site?) и загрузить ссылку изображения с помощью CefBrowserHost.StartDownload.

Смежные вопросы