Загрузка нового окна из локальных файлов и доступ к его содержимому - PullRequest
0 голосов
/ 26 марта 2019

Я настраиваю локальную веб-страницу, которая показывает видео в теге видео HTML5. Я просто хочу иметь возможность выполнять поиск в базе данных по запросу PHP и показывать результаты, по которым я могу нажать, и показывать видео, которое я хочу. У меня проблема в том, что видео загружаются ПУТЬ быстрее при загрузке из ссылки «file: ///», чем из ссылки «http://"». Сервер работает без сбоев в режиме «HTTP», но в «file» ничего не работает: // / "режим, который является нормальным, поскольку PHP-коды выполняются только на стороне сервера при запросе к серверу.

Я провел целый день, пытаясь так много вещей. Я изменил свой сервер для принятия CORS, я попытался window.open, сохраняя ссылку в переменной, локальной или глобальной, но я теряю это, как только выхожу из функции javascript. Я пробовал window.open в функции, которая вызывается из другой функции, но независимо от того, что я делаю, ссылка на окно теряется, как только я покидаю функции или когда функции завершены. Так как мой браузер используется в качестве основного браузера, я не хочу отключать систему безопасности вокруг CORS, но так как ссылка на мою веб-страницу происходит из «file: ///», запрашивающего «HTTP» на том же компьютере, CORS блокирует меня и хочет HTTP-запрос, который я не могу дать.

Я выполнил весь поиск для поиска информации с другой веб-страницы, но я всегда сталкиваюсь с проблемой "того же домена". Я попробовал AJAX HTTPRequest, у меня просто нет больше решения для этой простой проблемы, которая оказалась намного сложнее, чем ожидалось. Первоначальная проблема заключалась в том, что мои видео загружались недостаточно быстро в режиме HTTP (разница в скорости чрезвычайно велика, для 10-минутных видео я могу ждать 5-10 секунд, чтобы пропустить его, пока, как в FILE: /// urls, это почти мгновенно , больше не нужно ждать. Более длинные видео продолжительностью 1 час, я могу ждать до 20 и 30 секунд, как в режиме file: ///, почти мгновенно.) и мне пришлось изучить все, что разрешено в междоменных вещах, которые также оказались безуспешными , Я полагаю, что, возможно, некоторые другие головы могут иметь лучшие идеи, чем моя сейчас.

#In my httpd.conf file from Apache
DocumentRoot "e:/mainwebfolder"
Alias "/lp" "d:/whatever"

//////////////////////////////////////
// index.php file that does not contain PHP contents
// window.location.href: file://d:/whatever/index.php
//////////////////////////////////////
<head>
  <script src="html/servcom.js" type="text/javascript"></script>
</head>
<video id="vplayer" width="1280" height="720" controls></video>
<div id="search-form">
  <input id="srch" name="srch" type="text">
  &nbsp;<button class="bbut" onclick="ServInfo('search-results','http://127.0.0.1/lp/html/db.php','mode=s','search-form');">Search</button>
</div>
<div id='search-results'></div>

<script>
  var dplay = document.getElementById("vplayer");
ShowVideo('MyVideo.mp4');
  function ShowVideo (vidUrl) {
    dplay = document.getElementById("vplayer");
    dplay.src = vidUrl;
    dplay.load;
  }
</script>

//////////////////////////////////////
// Now this is in my javascript file servcom.js
//////////////////////////////////////
var win_ref = -1;

function ServInfo(pop_field_id,web_page,params="",form_id="",exec_string = "") {

  var sparams = params;
  var swpage = web_page;
  var eobj = document.getElementById(pop_field_id);
  var moreparams = "";

  // If we entered extra parameters including form fields,
  // add the the "&" before the form field list
  if (sparams != "") {moreparams = "&";}

  // Get form field values if a form id is specified
  if (form_id != "") {
    var efrm = document.getElementById(form_id);
    sparams += moreparams+GetDivFields(form_id);
  }

  // Add the question mark if there is any parameters to pass
  if (sparams != "") {
    sparams = "?"+sparams;
    // Add recieving objects reference
    sparams += "&srco="+pop_field_id;
  }

  // If HTML element to populate does not exist, exit
  if (typeof(eobj) == "!undefined" || eobj == null) {return;}

  win_ref = window.open(swpage+sparams,"_blank");
//////////////////////////////////////
// right here win_ref will never be available once the code from this function has been finished executing although the variable is global. The problem starts here.
//////////////////////////////////////

  // Execute a string if a user defined one
  if (exec_string != "") {eval(exec_string);}
}

// Build a parameter string with div fields of type text, hidden or password
function GetDivFields(div_id) {

  var ediv = document.getElementById(div_id);
  var elem = ediv.children;
  var retval = "";
  var ssep = "";

  for (var i = 0; i < elem.length; i++) {
  if (elem[i].type == "text" || elem[i].type == "hidden" || elem[i].type == "password") {
    retval += ssep+elem[i].name+"="+pURL(elem[i].value);
    ssep = "&";
  }
  if (elem[i].type == "checkbox") {
    if (elem[i].checked == true) {
      retval += ssep+elem[i].name+"="+elem[i].value;
      ssep = "&";
    }
  }
}

return retval;

}
//////////////////////////////////////
// And this is a brief overview of my db.php page
//////////////////////////////////////
<?php // Search Database code ?>
<div id="output"></div>
<script>
  document.getElementById('output').innerHTML = "<?php echo $search_results; ?>";
  // I actually want to retrieve the info from this div element once it has been populated from the initial page that called window.open for this page. BUT again. window.opener becomes empty once my initial window.open script finishes.
</script>

Доступ к моей только что загруженной странице "output" div innerHTML ИЛИ загрузка видео через локальный HTTP с такой скоростью, как "FILE: ///".

1 Ответ

0 голосов
/ 28 марта 2019

Ну, я фанатично нашел решение. Поскольку это только для локального и презентационного использования, я мог обойти некоторые ценные бумаги. По сути, делать то, что мы обычно НЕ делаем на веб-сайте, но все это БЕЗ изменения конфигурации вашего веб-сервера или касания любого файла .htaccess. По сути, никаких ограничений безопасности, просто старый взлом, который не представляет никаких нарушений безопасности для вашего браузера или вашего сервера.

Примечание:

  1. Существуют 2 разных веб-сайта (поэтому 2 разные папки в самых разных местах), 1 для разработки и серьезных выпусков, один для внутренних и / или презентационных целей.

  2. Каждый файл является локальным и внутри папки презентации.

  3. PHP-код не может быть запущен по ссылке "file: ///".

  4. Доступ к базе данных mysql осуществляется через PHP, а сервер находится на Apach24

  5. Локальное чтение видео по ссылке "file: ///" намного быстрее, чем по ссылке http://" 1026 *

  6. Поиск должен быть выполнен в базе данных MySQL из ссылки "http://"", а результаты должны отображаться на веб-странице, открытой по ссылке "file: ///".

  7. Не следует вносить изменения в конфигурацию браузера, поэтому отключение CORS не является решением.

  8. Обход кодов с помощью методов, предложенных многими сайтами, не будет работать из-за соображений безопасности или из-за того, что обход CORS не принимает ссылки "file: ///"

PHP может записывать файлы на сервер, где я решил обойти CORS. Поскольку запросы XML через AJAX могут выполняться в одном и том же домене происхождения, то есть исключительно в javascript. Если существует файл, который не содержит код PHP и находится в том же Domaine I / E "file: ///", содержимое может быть прочитано без каких-либо проблем.

Поэтому я просто делаю следующее в моем файле db.php:

$s_mode = "";
$s_text = "";
$sres = "";

if (isset($_REQUEST["srch"])) {$s_text=$_REQUEST["srch"];}
if (isset($_REQUEST["mode"])) {$s_mode=$_REQUEST["mode"];}

if ($s_mode == "s") {
    $sres = SearchDB($s_text);
    WriteFile("D:/whatever/my_path/dbres.html",$sres);
}

// Writes the contents of the search in a specified file
function WriteFile($faddress,$fcontents) {
    $ifile = fopen($faddress,"w");
    fwrite($ifile,$fcontents);
    fclose($ifile);
}

Теперь, используя обычный запрос AJAX, я делаю 2 вещи. Я решил использовать iframe со стилем «display: none», чтобы не беспокоиться об открытии другой вкладки.

  1. Выполните фактический запрос, который открывает ссылку "cross-doamin" в iframe, КОТОРЫЙ выполняет мой код db.php. Я в основном открываю "http://127.0.0.1/whatever/db.php?param1=data&parma2=data" внутри моего iframe.

  2. Как только мой поиск будет завершен, и у меня будут результаты, мой db.php сохранит html-файл с результатами, так как он содержится в моем пути к файлу "file: ///" так: "D: / независимо от / my_path / dbres.html».

Я добавил новую функцию в мой servcom.js. Итак, содержимое моего нового файла выглядит так:

// Show page info in another page element or window with parameters (for local use only)
function ServInfoLocal(dest_frame,web_page,params="",form_id="") {
    var sparams = params;
    var swpage = web_page;
    var iweb = document.getElementById(dest_frame);
    var moreparams = "";

    // If we entered extra parameters including form fields,
    // add the the "&" before the form field list
    if (sparams != "") {moreparams = "&";}

    // Get form field values if a form id is specified
    if (form_id != "") {
        var efrm = document.getElementById(form_id);
        sparams += moreparams+GetDivFields(form_id);
    }

    // If destination frame does not exist, exit
    if (typeof(iweb) == "!undefined" || iweb == null)   {return;}

    // Add the question mark if there is any parameters to pass
    if (sparams != "") {sparams = "?"+sparams;}

    // Show results in iframe
    iweb.src = swpage+sparams;

}

// AJAX simple HTTP GET request
function ServInfo(pop_field_id,web_page,params="",form_id="",append_data_to_output = "",exec_string = "",dont_show_results = "") {

    var sparams = params;
    var swpage = web_page;
    var eobj = document.getElementById(pop_field_id);
    var moreparams = "";

    // If we entered extra parameters including form fields,
    // add the the "&" before the form field list
    if (sparams != "") {moreparams = "&";}

    // Get form field values if a form id is specified
    if (form_id != "") {
        var efrm = document.getElementById(form_id);
        sparams += moreparams+GetDivFields(form_id);
    }

    // If HTML element to populate does not exist, exit
    if (typeof(eobj) == "!undefined" || eobj == null)   {return;}

    if (window.XMLHttpRequest) {
        // IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
    }
    else {
        // IE6-
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            // Do not show any results if requested
            if (dont_show_results == "") {
                if (append_data_to_output == "y") {
                    document.getElementById(pop_field_id).innerHTML += this.responseText;
                }
                if (append_data_to_output == "") {
                    document.getElementById(pop_field_id).innerHTML = this.responseText;
                }
            }
            // Execute a string if a user defined one
            if (exec_string != "") {
                eval(exec_string);
            }
        }
    };
    // Add the question mark if there is any parameters to pass
    if (sparams != "") {swpage += "?";}

    xmlhttp.open("GET",swpage+sparams,true);
    xmlhttp.send();

    }

// Build a parameter string with div fields of type text, hidden or password
function GetDivFields(div_id) {

    var ediv = document.getElementById(div_id);
    var elem = ediv.children;
    var retval = "";
    var ssep = "";

    for (var i = 0; i < elem.length; i++) {
        if (elem[i].type == "text" || elem[i].type == "hidden" || elem[i].type == "password") {
            retval += ssep+elem[i].name+"="+pURL(elem[i].value);
            ssep = "&";
        }
        if (elem[i].type == "checkbox") {
            if (elem[i].checked == true) {
                retval += ssep+elem[i].name+"="+elem[i].value;
                ssep = "&";
            }
        }
    }

    return retval;

}

Теперь мой файл dbres.html будет содержать только элементы div и всю информацию, необходимую для отображения на моей странице "file: ///", с которой пришел поисковый запрос. Так что у меня просто есть это на моей странице:

<div id="search-form" style="color:white;font-weight:bold;">
    <input id="srch" name="srch" type="text">
    &nbsp;<button class="bbut" onclick="ServInfoLocal('iweb','http://127.0.0.1/whatever/html/db.php','mode=s','search-form');">Search</button>
    <button class="bbut" onclick="ServInfo('search-results','dbres.html');">Click here</button>
</div>

<div id="search-results">Results here</div>

<iframe id="iweb" style="display:none;" src=""></iframe>

На данный момент у меня есть 2 кнопки, одна для поиска и одна, чтобы показать результаты из моего недавно созданного файла. Теперь я могу показать свои локальные видео, которые будут загружаться в мой контейнер видео с источником «file: ///» напрямую, без прохождения через http. Я сделаю так, чтобы результаты отображались автоматически, и теперь я смогу делать это сам.

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

Для любопытных, следующим шагом будет зацикливание моей папки, пока мой файл dbres не появится, используя другую функцию js. Как только мой файл будет извлечен, вызовите другой php-файл, который уничтожит созданный файл, и я буду готов к другому запросу базы данных со своей веб-страницы, расположенной в расположении «file: ///».

...