轉載: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);//有參數函數
....