Как проверить статус и скачать файл по ссылке на сервер в фоновом режиме php - PullRequest
0 голосов
/ 03 марта 2020

У меня есть приложение, в котором пользователь загружает файл CSV или TXT, и моя система проверяет электронную почту из файла, а затем загружает результаты в каталог загрузки. но иногда, если размер файла большой, например, 1 миллион писем, проверка этого файла занимает некоторое время. и ссылка для скачивания файла не будет доступна. В этом случае я хочу показать пользователю, что мы проверяем его файл. это может занять несколько минут, и я знаю, как это сделать. Мне нужно знать, как сделать сценарий, который проверяет, не завершен ли статус, затем подождать некоторое время и попытаться снова загрузить файл. Примечание: сценарий go перейдет по ссылке и загрузит файл с file_put_contents (UPLOAD_DIRECTORY, fopen ($ url));

Вот функция, которая загружает файл

function downloadResultFilesInServer($file_id, $fileName) {
    $downloadURL = "https://bulkapi.millionverifier.com/bulkapi/v2/download";
    $key = VERIFIER_API_KEY;
    $url = $downloadURL . "?key=$key&file_id=$file_id&filter=";
    file_put_contents(UPLOAD_DIRECTORY . "/" . $fileName . "_OK_ONLY.csv", fopen($url . "ok", 'r'));
    file_put_contents(UPLOAD_DIRECTORY . "/" . $fileName . "_OK_AND_CATCH_ALL.csv", fopen($url . "ok_and_catch_all", 'r'));
    file_put_contents(UPLOAD_DIRECTORY . "/" . $fileName . "_UNKNOWN.csv", fopen($url . "unknown", 'r'));
    file_put_contents(UPLOAD_DIRECTORY . "/" . $fileName . "_INVALID.csv", fopen($url . "invalid", 'r'));
    file_put_contents(UPLOAD_DIRECTORY . "/" . $fileName . "_FULL_REPORT.csv", fopen($url . "all", 'r'));
}

Вот мои условия

// If verification is in progress insert the details in db
if (in_array($o["status"],['in_progress'])) {
    $_SESSION['verifyInProgress'] = $o["file_id"];
    insertEmailListResultsInDatabase($userId, $o, $fileNameNew, $connection);

} elseif (in_array($o["status"],['canceled'])) {
    // if verification is cancelled show user alert
    echo "<script>alert('Verification was canceled by user')</script>";
}

if (!in_array($o["status"],['finished', 'canceled'])) {
    // keep trying to download file 
}

Ответы [ 2 ]

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

Чтобы проверить состояние файла, вы должны создать метод JavaScript для вызова конечной точки, которая предоставляет обновленную информацию о состоянии.

Вы можете использовать setInterval и получить API для вызова сервера.

Вот рабочий пример:

var checkFile = setInterval(checkFileStatusOnServer, 5000); // Call the server every 5 seconds

function checkFileStatusOnServer() {

    const todoIds = [2, 3, 4];
    const randomId = todoIds[Math.floor(Math.random() * todoIds.length)];

    fetch('https://jsonplaceholder.typicode.com/todos/' + randomId)
    .then(response => response.json())
    .then(json => {
        console.log(json.completed);
        const completed = Boolean(json.completed);
        if(completed) {
            alert('Download file!');
            clearInterval(checkFile);
        }
        return json.completed;
    });
}

В этом API завершен только TODO ID 4. Давайте рассмотрим этот элемент в качестве примера, когда файл, наконец, станет доступен для загрузки.

ОБНОВЛЕНИЕ

Вы должны изменить URL-адрес в методе выборки, указав фактическую реализацию в PHP, где вы обрабатываете файл и делаете его доступным для загрузки, как только он будет готов.

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

Back-end: при завершении загрузки файла (после загрузки файла) установите, например, переменную SESSION в одно значение, а при завершении проверки электронной почты - в другое.

Font-end: при завершении загрузки файла (после файл загружен) покажите ширину экрана ожидания, какую-то циклическую анимацию, и примерно каждую секунду, используя javascript, отправляйте запрос на сервер, чтобы проверить, не изменилось ли значение переменной SESSION на второе значение, если это так, покажите результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...