使用media_handle_upload上传图片至WordPress服务器失败求助
WordPress竞赛申请功能图片上传报错:Specified file failed upload test.
开发WordPress竞赛申请功能时,未授权用户完成支付后通过AJAX以FormData格式提交表单,PHP端可成功创建gallery类型帖子,但调用media_handle_upload上传图片时失败,报错提示:Specified file failed upload test.
相关代码
前端代码
- 支付数据获取函数
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; }
- 支付成功后的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); }, error: function(response) { console.log(response); console.error('Error data send.'); } }); checkout.destroy(); }); checkout.render('payment-form'); setTimeout(function() { }, 300); } else { console.log('No token') } }, error: function() { console.error('Errror data send.'); } });
- FormData构建逻辑
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]); } }
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'); $formData = $_POST; $formFiles = $_FILES; $artFiles = array(); foreach ($formFiles as $key => $file) { if (strpos($key, "art-file-") === 0) { $artFileNumber = substr($key, strlen("art-file-")); $artFiles[$artFileNumber] = $file; } } // 遍历获取artNames等代码省略 foreach ($artNames as $artNameNumber => $artName) { $artFile = isset($artFiles[$artNameNumber]) ? $artFiles[$artNameNumber] : ''; $post_data = array( 'post_type' => 'gallery', 'post_status' => 'draft', 'post_parent' => $parent_page_id, 'post_title' => $artName, 'post_content' => $artFile['name'] . ' : ' . $artFile['tmp_name'] . ' : ' . $artFile['size'] ); $post_id = wp_insert_post($post_data); update_post_meta($post_id, '_wp_page_template', 'single-cat-gallery.php'); // 错误写法 $attachment_id = media_handle_upload( $artFile, $post_id ); if ( is_wp_error( $attachment_id ) ) { $error_message = $attachment_id->get_error_message(); echo json_encode( array( 'error' => $error_message ) ); } update_post_meta( $post_id, '_thumbnail_id', $attachment_id ); }
错误信息
返回的错误内容:
"{"error":"Specified file failed upload test."}{"error":"Specified file failed upload test."}"
问题解决
经排查,media_handle_upload函数的第一个参数要求传入$_FILES数组中的文件键名,而不是直接传入文件数组。修改PHP中的上传代码为:
$attachment_id = media_handle_upload( 'art-file-' . $artNameNumber, $post_id );
内容的提问来源于stack exchange,提问作者nvrndev
相关产品推荐
相关产品推荐

