PHP: скачать файл через AJAX по ссылке нажмите в WordPress - PullRequest
0 голосов
/ 05 января 2019

В настоящее время я пытаюсь загрузить файл с моего сервера с помощью запроса PHP AJAX. Я построил это так:

Сначала я получаю все файлы (в этом примере только один) и создаю ссылку:

$invoice_number_base = 'RE-2018-12-00000039-E';

//Get all generated PDF file names by tmp path and invoice number base
foreach ( glob( '/var/www/vhosts/localhost/httpdocs/wp-content/uploads/wpo_wcpdf/attachments/' . $invoice_number_base . '*.pdf' ) as $file ) { ?>
    <a target="_blank" class="admin_et_pb_button"
       onclick="showGenInvoice('<?php echo $file ?>')">
        <?php echo basename( $file ) ?>
    </a>
<?php }

Здесь генерируется эта ссылка

<a target="_blank" class="admin_et_pb_button" onclick="showGenInvoice('/var/www/vhosts/localhost/httpdocs/wp-content/uploads/wpo_wcpdf/attachments/RE-2018-12-00000039-E.pdf')">RE-2018-12-00000039-E.pdf</a>

Теперь я создал свою функцию JS для вызова функции AJAX, когда пользователь нажимает кнопку:

function showGenInvoice(file) {

    var data = {
        'action': 'show_gen_invoice',
        'file': file
    };

    jQuery.post(ajaxurl, data, function () {
    }).fail(function () {
        alert('An error occured!')
    });
}

(функция имеет ссылку на параметр, которая содержит путь к каждому файлу на моем сервере)

После этого я создаю обратный вызов AJAX в WordPress:

/**
 * Get generated invoice from attachments folder so the invoices which are sent by email
 */
add_action( 'wp_ajax_show_gen_invoice', array( $this, 'show_gen_invoice' ) );
public function show_gen_invoice() {
    //Get file path from request
    $file = $_POST['file'];
    if ( is_admin() && file_exists( $file ) ) {
        header( 'Content-Description: File Transfer' );
        header( 'Content-Type: application/octet-stream' );
        header( 'Content-Disposition: attachment; filename="' . basename( $file ) . '"' );
        header( 'Expires: 0' );
        header( 'Cache-Control: must-revalidate' );
        header( 'Pragma: public' );
        header( 'Content-Length: ' . filesize( $file ) );
        ob_clean();
        flush();
        readfile( $file );
        wp_die();
    } else {
        wp_send_json_error( null, 500 );
        wp_die();
    }
}

Но, к сожалению, файл не загружается, когда я нажимаю кнопку. Нет ошибок, просто ничего не происходит. Что здесь не так?

Примечание:

Папка, в которой находится файл, защищена и недоступна с обычным URL страницы и /uploads/...

Обновление

Пожалуйста, проверьте мое решение! Его можно использовать, когда вы хотите загрузить что-то со своего сервера из серверной части с помощью PHP.

1 Ответ

0 голосов
/ 06 января 2019

Спасибо Ахамду за подсказку. Это мое решение проблемы:

Новая ссылка:

//Get invoices tmp path
$tmp_path = WPO_WCPDF()->main->get_tmp_path( 'attachments' );
//Get invoice number
$invoice_number_base = $invoice->get_number()->get_formatted(); ?>
<div class="wpo_wcpdf-generated-invoices-container">
    <?php
    //Get all generated PDF file names by tmp path and invoice number base
    foreach ( glob( $tmp_path . $invoice_number_base . '*.pdf' ) as $invoice ) { ?>
        <a target="_blank"
           class="admin_et_pb_button"
           href="post.php?invoice=<?php echo basename( $invoice ) ?>">
            <?php echo basename( $invoice ) ?>
        </a>
    <?php } ?>
</div>
<?php

Код для отображения файла в браузере:

/**
 * Add file download functionality to admin post
 */
add_action( 'admin_init', 'show_gen_invoice' );
function show_gen_invoice() {

    //Check if invoice is set and get value = the path of the invoice
    if ( isset( $_REQUEST['invoice'] ) ) {

        //Get invoices tmp path
        $tmp_path = WPO_WCPDF()->main->get_tmp_path( 'attachments' );

        //Get invoice basename
        $invoice = urldecode( $_REQUEST['invoice'] );

        if ( is_admin() && file_exists( $tmp_path . $invoice ) ) {
            $content = file_get_contents( $tmp_path . $invoice );
            header( 'Content-Type: application/pdf' );
            header( 'Content-Length: ' . filesize( $tmp_path . $invoice ) );
            header( 'Content-Disposition: inline; filename=' . $invoice );
            header( 'Cache-Control: private, max-age=0, must-revalidate' );
            header( 'Pragma: public' );
            ini_set( 'zlib.output_compression', '0' );
            flush();
            die( $content );
        }
    }
}

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

Теперь я использую хук admin_init, чтобы получить свой код в файл post.php, где я могу использовать $_REQUEST, чтобы получить этот файл.

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