CEF C++調用前端js方法展示傳遞過來的圖片數據


轉載:https://blog.csdn.net/lengyuezuixue/article/details/79769103

在項目開發過程中遇到一個需求,通過C++調用js方法傳參給前端顯示圖片,但前端如果想顯示一個本地絕對路徑的一張圖片,必須把圖片內容轉換成base64,原因是瀏覽器中的JavaScript不能直接直接訪問本地資源(例如文件系統,攝像頭,麥克風等),除非事先得到了用戶的允許,之所以進行該限制也是很有必要的,如果JavaScript能夠肆無忌憚的訪問本地的文件系統,那么竊取用戶隱私數據就變得輕而易舉了,當用戶訪問網絡上的某個網頁時,不知不覺中自己機器上保存的信用卡卡號,密碼,公司的秘密文件等隱私文件或許已經被惡意的JavaScript程序上傳到了遠方的服務器上,這對用戶來說是不可容忍的。

1.簡單的調用js函數的方式:

m_handler->GetBrowser()->GetMainFrame()->ExecuteJavaScript(strJSFuncName, m_handler->GetBrowser()->GetMainFrame()->GetURL(), 0);

具體調用可以參考我之前關於CEF博客

例如:

frame->ExecuteJavaScript(L"ModifyValue();",frame->GetURL(),0);//無參數函數
frame->ExecuteJavaScript(L"ModifyValue('巴薩牛逼');",frame->GetURL(),0);//有參數函數
如果參數是可變的,可以這樣
CString strJsCode;
strJsCode.Format(L"setInstallStatus('%s','%s','%d');", lpData->strId.c_str(), strStatus, nPercent);
其中setInstallStatus是js函數,它有三個參數

但在具體調用過程中遇到,

 

 感覺是字符串被截斷了,沒法當成一個js函數調用,然后調試圖片轉成base64生成的buffer,如下圖發現字符串里面很多"\r\n"

應該是"\r\n"這個原因造成的,所以應該把字符串中的"\r\n"過濾掉。

wstring&   replace_all_WString(wstring&   str, const   wstring&   old_value, const   wstring&   new_value)
{
    wstring::size_type   pos(0);
    while (true)   {

        if ((pos = str.find(old_value, pos)) != wstring::npos)
        {
            str.replace(pos, old_value.length(), new_value);
            pos += new_value.length();
        }
        else   break;
    }
    return   str;
}

....

wstring  wstrBase64=L"data:image/jpeg;base64,.....";

wstrBase64 = replace_all_WString(wstrBase64, L"\r\n", L"");//過濾\r\n

 CString strJson;
 strJson.Format(L"ModifyValue('%s');", wstrBase64.c_str());

 frame->ExecuteJavaScript(wstrBase64,frame->GetURL(),0);//有參數函數

 ....

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM