Отправка формы и загрузка файла за одно действие - PullRequest
0 голосов
/ 03 марта 2020

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

        <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post" name="download">
            <tr>
                <td width='30%' class="left">Your name</td>
                <td width='70%'><input name="name" type="text" value=""></td>
            </tr>
            <tr>
                <td class="left">Your organisation</td>
                <td><input name="organisation" type="text" value=""></td>
            </tr>
            <tr>
                <td class="left">The place your map will cover</td>
                <td><input name="area" type="text" value=""></td>
            </tr>
            <tr>
                <td class="left">Your email</td>
                <td><input name="email" type="text" value=""></td>
            </tr>
            <tr>
                <td class="left">&nbsp;</td>
                <td><input name="MM_load" type="hidden" value="download">
                    <input style="margin-top: .8em" type="submit" class="button" value="Download Now"></td>
            </tr>
        </form>

В PHP до HTML у меня есть:

if ((isset($_POST['MM_load']))&&($_POST['MM_load']=='download')) {
    $organisation = mysqli_real_escape_string($db, stripslashes($_POST['organisation']));
    $area = mysqli_real_escape_string($db, stripslashes($_POST['area']));
    $name = mysqli_real_escape_string($db, stripslashes($_POST['name']));
    $email = mysqli_real_escape_string($db, stripslashes($_POST['email']));
    $query_insert = "INSERT INTO downloads (organisation, area, name, email) VALUES ('$organisation', '$area', '$name', '$email')";
    $result = $db->query($query_insert) or die($db->error.__LINE__);


echo "<script>window.getElementsByClassName('dl_link').click();</script>";

  $insertGoTo = "thanks.php";
  echo "<script type='text/javascript'>window.location.href='".$insertGoTo."'</script>";
}

Затем в теле страницы находится ссылка для скачивания:

<a style="visibility:hidden" class="dl_link" href="https://example.com/defib-package/defib.1.1.zip" download></a>

Цель:

  1. Пользователь заполняет форму и нажимает кнопку Загрузить сейчас.

  2. Страница перезагружается и вставляет данные в базу данных.

  3. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1052]. 1023 *

  4. Затем пользователь перенаправляется на страницу благодарности. php страница.

Шаги 1, 2 и 4 работают, но 3 - нет.

Я пытался изменить ссылку на скачивание, чтобы ее можно было щелкнуть вручную. Это тогда работает. Я попытался поместить PHP (включая встроенный javascript) в заголовок страницы, который не помогает. Я новичок в javascript, поэтому я ожидаю, что проблема лежит там, но это код, который я скопировал из другого ответа о переполнении стека. Откуда мне go отсюда?

РЕДАКТИРОВАТЬ в ответ на ответ coredo. Coredo помог мне добиться определенного прогресса, но я еще не там. Тайм-аут работает хорошо, но я получаю «Uncaught TypeError: window.getElementById не является функцией» в консоли для щелчка по ссылке. Я поменял класс на id и поместил его в функцию, но все попытки выдают что-то по одной линии. Мой последний код:

$insertGoTo = "thanks.php";
  echo "<script type='text/javascript'>
    alert('Just starting');
    function dl() {window.getElementById('dl_link').click();}
    dl();
  alert('Part way');
  setTimeout(function(){ window.location.href='".$insertGoTo."' }, 5000);
  </script>";

РЕДАКТИРОВАТЬ 2 Взломали его!

  1. getElementById не работает с элементом окна. Его пришлось изменить на документ.

  2. Похоже, что щелчок пытался выполнить до создания DOM. Так что я завернул его в window.onload. Окончательная форма скрипта:

    $ insertGoTo = "спасибо. php"; echo "window.onload = function () {document.getElementById ('dl_link'). click ();} setTimeout (function () {window.location.href = '". $ insertGoTo. "'}, 2000);" ; }

1 Ответ

0 голосов
/ 03 марта 2020

Изменить

echo "<script>window.getElementsByClassName('dl_link').click();</script>";

на:

echo "<script>document.getElementsByClassName('dl_link')[0].click();</script>";

, так как getElementsByClassName может возвращать несколько объектов.

Также возможно, что перенаправление window.location.href будет перенаправлено пользователь слишком быстрый и загрузка может не начаться. Попробуйте добавить задержку, используя setTimeout:

setTimeout(function(){ window.location.href='".$insertGoTo."' }, 2000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...