如何将文件上传到服务器宽度media_handle_upload?

问题描述 投票:0回答:1

我在创建帖子时遇到问题,特别是上传帖子图片时遇到问题。这个想法是未经授权的用户提交竞赛申请。支付成功后,我通过ajax以Json格式发送表单数据。

  1. 支付付款数据:
    function getPayData() {
    
        var payData = {};
    
        
        payData['gallery-parent-id'] = {};
        payData['gallery-parent-id']['value'] = form.dataset.parent;
        payData['form-id'] = {};
        payData['form-id']['value'] = form.dataset.id;
        
        // return payData
        return payData;
    }
  1. Ajax支付:
$.ajax({
        url: url,
        type: 'POST',
        data: payData,
        success: function(response) {

            var response_end = JSON.parse(response);

            var confirmationToken = response_end.confirmation_token;
            var order_id = response_end.id;
            var amount = response_end.amount;
            if (confirmationToken) {
                const checkout = new window.YooMoneyCheckoutWidget({
                    customization: {
                        control_primary: '#81fdc5'
                    },
                    error_callback: function(error) {
                    }
                });

                checkout.on('success', () => {
                    formData.append('order id:', order_id);
                    formData.append('amount:', amount);
                    
                    const success_url = '/pay/success-pay-handler.php';

                    $.ajax({
                        url: success_url,
                        type: 'POST',
                        data: formData,
                        cache       : false,
                        dataType    : 'json',
                        processData : false,
                        contentType : false,
                        success: function(response) {

                            console.log(response);
                            //message.classList.add('show');
                        },
                        error: function(response) {
                            // Обработка ошибки
                            console.log(response);
                            console.error('Error data send.');
                        }
                    });
        
                    //del widget
                    checkout.destroy();
                });

        
                checkout.render('payment-form');
                setTimeout(function() {
                    //form.classList.add('in-process');
                }, 300);
            } else {
                console.log('No token')
            }
          


        },
        error: function() {
          // Error hand
          console.error('Errror data send.');
        }
    });
  1. 表单数据:
    formData = new FormData();

    for (var i = 0; i < form.elements.length; i++) {
        var element = form.elements[i];
        if (element.type === 'text' || element.type === 'textarea' || element.type === 'number' || element.type === 'mail') {
                    
            var label = document.querySelector('label[for="' + element.name + '"]');

            var name = element.name;

            var title = label.textContent.trim();
            var value = element.value;

            var valueWithLabel = [title, value];

            formData.append(name, valueWithLabel);

        } else if (element.type === 'file') {

            var name = element.name;

            formData.append(name, element.files[0]);
        }
    }
  1. 表单数据的 Ajax
                    $.ajax({
                        url: success_url,
                        type: 'POST',
                        data: formData,
                        cache       : false,
                        dataType    : 'json',
                        processData : false,
                        contentType : false,
                        success: function(response) {
                            console.log(response);
                        },
                        error: function(response) {
                            console.log(response);
                            console.error('Error data send.');
                        }
                    });

我在 PHP Handler 中成功接收了表单数据。首先,我包含操作所需的文件:

require_once( $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php' );

require_once(ABSPATH . 'wp-admin/includes/image.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/media.php');

然后我从 ajax 检索数据,一个包含常规数据 - $formData,另一个包含文件 - $formFiles。

    $formData = $_POST;
    $formFiles = $_FILES;

接下来,我迭代表单字段 + ACF 数组。帖子已成功创建,因此我暂时不会发送整个代码。 然后,当我尝试上传帖子的图像时,问题就开始了。我遍历 $_FILES,将值存储在 $artFiles 数组中。

    $artFiles = array();
    
    foreach ($formFiles as $key => $file) {
        if (strpos($key, "art-file-") === 0) {
            $artFileNumber = substr($key, strlen("art-file-"));
            $artFiles[$artFileNumber] = $file;
        }
    }

我的 $artNames foreach:


    foreach ($formData as $key => $value) {
        if (strpos($key, "art-name-") === 0) {
            // Разбиваем строку значения по запятой
            $parts = explode(',', $value);
    
            // Проверяем, что в массиве $parts есть второй элемент
            if (isset($parts[1])) {
                $artNameNumber = str_replace("art-name-", "", $key);
                $artName = trim($parts[1]);
    
                // Добавляем значения в соответствующие массивы
                $artNames[$artNameNumber] = $artName;
            }
    }

创建帖子:

foreach ($artNames as $artNameNumber => $artName) {
        $artHeight = isset($artHeights[$artNameNumber]) ? $artHeights[$artNameNumber] : '';
        $artWidth = isset($artWidths[$artNameNumber]) ? $artWidths[$artNameNumber] : '';
        $artMaterial = isset($artMaterials[$artNameNumber]) ? $artMaterials[$artNameNumber] : '';
        $artDescr = isset($artDescrs[$artNameNumber]) ? $artDescrs[$artNameNumber] : '';
        $artFile = isset($artFiles[$artNameNumber]) ? $artFiles[$artNameNumber] : '';

        $artFileInfo = $artFile['name'] . ' : ' . $artFile['tmp_name'] . ' : ' . $artFile['size']; // OK, it's work!
        $post_data = array(
            'post_type' => 'gallery',
            'post_status' => 'draft',
            'post_parent' => $parent_page_id,
            'post_title'     => $artName,
            'post_content' => $artFileInfo // For tests, it's OK: food-cat-image-2.jpg : /tmp/phpos4nzn : 2937708
        );


        $post_id = wp_insert_post($post_data);
    
        update_post_meta($post_id, '_wp_page_template', 'single-cat-gallery.php');


        // Upload File

        $attachment_id = media_handle_upload( $artFile, $post_id ); // Not work
        

        if ( is_wp_error( $attachment_id ) ) {
            $error_message = $attachment_id->get_error_message();
            echo json_encode( array( 'error' => $error_message ) );
        } else {
            echo json_encode( array( 'success' => 'File Upload Complete! ID:' . $attachment_id ) );
        }

        update_post_meta( $post_id, '_thumbnail_id', $attachment_id ); // OK, it's work!

        //
    
        if( is_wp_error($post_id) ){    

        } else {
            if (function_exists('update_field')) {

                // Acf fields
                
            }
        }
    
    }

字符串

$artFileInfo = $artFile['name'] . ' : ' . $artFile['tmp_name'] . ' : ' . $artFile['size']

=

cat-image-2.jpg : /tmp/phpos4nzn : 2937708

我尝试了很多不同的选择,但没有一个有帮助。

也许此信息可以提供帮助:我添加了对 is_wp_error 的检查并收到以下消息:

responseText : 
"{\"error\":\"Specified file failed upload test.\"}{\"error\":\"Specified file failed upload test.\"}"
status : 200
statusText : "parsererror"

还有更多:

var_dump($_FILES):

array(2) {
  ["art-file-1"]=>
  array(5) {
    ["name"]=>
    string(18) "food-cat-image.jpg"
    ["type"]=>
    string(10) "image/jpeg"
    ["tmp_name"]=>
    string(14) "/tmp/php3xJrf3"
    ["error"]=>
    int(0)
    ["size"]=>
    int(272437)
  }
  ["art-file-2"]=>
  array(5) {
    ["name"]=>
    string(17) "video-preview.jpg"
    ["type"]=>
    string(10) "image/jpeg"
    ["tmp_name"]=>
    string(14) "/tmp/phpGsRXSE"
    ["error"]=>
    int(0)
    ["size"]=>
    int(100533)
  }
}

我重新阅读了很多类似的主题,但没有解决方案对我有帮助。请救救我。

我尝试添加我的 PHP 处理程序:

require_once( $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php' );

require_once(ABSPATH . 'wp-admin/includes/image.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/media.php');

我尝试以不同的方式迭代 $_FILES

使用不同的功能进行上传

我尝试在 media_handle_upload 函数中指定不同的值:

$attachment_id = media_handle_upload( $artFile['name']/$artFile['tmp_name']/$_FILES['art-file-1']..., $post_id );

所有 php.info 设置都正常。

更新:

非常感谢您的关注@CBroe!

我们的 $artFile 似乎是一个数组 - $_FILES 数组的条目之一;但 media_handle_upload 想要一个字符串 $file_id 作为第一个参数,即 $_FILES 数组中文件的键。您应该调用它来处理第一个上传的文件的值是 art-file-1

对于我的示例,所有问题都是这样的:

$attachment_id = media_handle_upload( $artFile, $post_id );

正确选项

$attachment_id = media_handle_upload( 'art-file-' . $artNameNumber, $post_id );
php ajax wordpress backend handler
1个回答
0
投票

我使用这个代码希望对你有帮助

 // it allows us to use wp_handle_upload() function
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    require_once(ABSPATH . 'wp-admin/includes/file.php');
    require_once(ABSPATH . 'wp-admin/includes/media.php');

    $upload = wp_handle_upload(
        $_FILES['uploaded'],
        array('test_form' => false)
    );

    if (!empty($upload['error'])) {
        $this->sendMessage('1');
        return false;
    }

    // it is time to add our uploaded image into WordPress media library
    $attachment_id = wp_insert_attachment(
        array(
            'guid'           => $upload['url'],
            'post_mime_type' => $upload['type'],
            'post_title'     => basename($upload['file']),
            'post_content'   => '',
            'post_status'    => 'inherit',
        ),
        $upload['file'],
        $postId
    );

    if (is_wp_error($attachment_id) || !$attachment_id) {
        return false;
    }

    set_post_thumbnail($postId, $attachment_id);
© www.soinside.com 2019 - 2024. All rights reserved.