Изменить программно значение IID_IHTMLInputFileElement - PullRequest
0 голосов
/ 26 ноября 2018

В течение нескольких дней я пытался программным путем поместить путь к файлу в элементе типа файла ввода в элемент управления CHtmlView (IE).Я пробовал это:

IHTMLInputFileElement* pInputElem = NULL;
hr = pElemDispatch->QueryInterface(IID_IHTMLInputFileElement, (void**)&pInputElem);
CString sFile(_T("C:\\Flaviu\\SomeFile.txt"));
BSTR bstrFilesAttribute = sFile.AllocSysString();
hr = pInputElem->put_value(bstrFilesAttribute); // hr is S_OK though
SysFreeString(bstrFilesAttribute);

, но не работало, я имею в виду, что не выбран SomeFile.txt во входном файле.

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

Где-то кто-то предложил простое решение: сделать копию исходной веб-страницы, отредактировать исходный код HTML и заменить элемент файла типа ввода натип ввода текста.Что я и сделал.Мне нужно решить только атрибут «action» в форме:

Исходный HTML-код оригинала:

<form name="uf" method="POST" action="/WS6ERT/SomeFile.do" enctype="multipart/form-data">
<div style="background-color: #c6c6c6; padding: 5px">
    <span>Choose file:</span> <span> <input type="file" name="linkdoc" size="75" value=""></span><span><input type="submit" value="Send"></span>
</div>
</form>

, и я сделал копию, и я заменил файл типа ввода текстом типа ввода:

<form name="uf" method="POST" 
action="https://originalsite.com/WS6ERT/SomeFile.do" enctype="multipart/form-data">
<div style="background-color: #c6c6c6; padding: 5px">
    <span>Choose file::</span> <span> <input type="text" name="linkdoc"> 
</span><span><input type="submit" value="Send"></span>
</form>

Атрибут важных тегов: " action = " Конечно, это не правильно, что я написал в моем HTML-источнике, потому что мой путь указывает на исходный файл, которыйЯ не редактировал ...

Есть ли способ решить эту проблему?Чтобы программно поместить путь к файлу в файл типа ввода в представлении CHtmlView?Или как решить эту проблему?

Последнее редактирование: Можно ли настроить файл с помощью JavaScript?Я видел здесь: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#attr-files, что можно настроить файл в атрибуте files .Но я не знаю, как это сделать ...

1 Ответ

0 голосов
/ 27 ноября 2018

Если у вас есть дескриптор CHtmlView*, используйте CHtmlView::Navigate2 или CHtmlView::Navigate

Это должно работать, если только элемент управления html не занят предыдущим запросом, например, вы уже сделали Navigate запрос и элемент управления html не закончили обработку этого запроса.В этом случае вы можете переопределить CHtmlView::OnNavigateComplete2, что даст вам знать, что элемент управления html завершен с предыдущим запросом навигации, и он может получить новый запрос.В качестве альтернативы вы можете использовать функцию ожидания, чтобы дождаться завершения управления, используя цикл for, показанный ниже.

CString filename = _T("C:\\Test\\test.html");
CStringW content = LR"(<html><body>  content  </body></html>)";

//optional: in case the control is busy with previous request
for(int i = 0; i < 100; i++)
{
    MSG msg;
    while(::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) 
        if(!AfxGetThread()->PumpMessage())
            break;
    CFile test;
    if(test.Open(filename, CFile::modeNoTruncate | CFile::modeWrite))
        break;
}

CFile fout;
if(fout.Open(filename, CFile::modeCreate | CFile::modeWrite))
{
    content = LR"(<html><body>  content UPDATE </body></html>)";
    CStringA utf8 = CW2A(content, CP_UTF8);
    fout.Write(utf8, utf8.GetLength());
    fout.Close();
    htmlview->Navigate(filename, 0, NULL);
}
...