gpt4 book ai didi

php - 妥善处理 "POST Content-Length of bytes exceeds the limit of"警告

转载 作者:可可西里 更新时间:2023-10-31 22:52:27 25 4
gpt4 key购买 nike

美好的一天)我正在构建一个 WordPress 插件 LMS,允许用户通过 AJAX 将他们完成的家庭作业文件附加到他们的答案中。一切正常,除了用户文件超过允许的最大大小的一种情况。在这种情况下,我的 AJAX 调用返回带有以下警告的 HTML:

<b>Warning</b>:  POST Content-Length of XXXXX bytes exceeds the limit of XXXXX bytes in <b>Unknown</b> on line <b>0</b><br />

由于在我的脚本的字符串 0 上生成了这种警告,它会死掉并忽略任何其他指令,因为我的调用而给我留下这个丑陋的字符串。你基本上可以接受它,因为最终用户不会看到它(只是 AJAX 调用不会得到预期的结果),但仍然我想知道是否有机会跳过它并很好地处理它?

好的,我已经做了什么样的研究:

  1. 我找到了 this Andrew Curioso 的教程,并尝试从中制作类似这样的东西:

    if (isset($_SERVER['CONTENT_LENGTH'])) {
    if ($_SERVER['CONTENT_LENGTH'] > (substr(ini_get('post_max_size'), -1) * 1024 * 1024)) {
    echo 'php errors is so much fun';
    }
    }

它没有产生预期的效果,因为我的脚本仍然死掉,只有从 IF 语句回显附加字符串的积极效果(此外,如果您尝试执行类似 wp_send_json(errorsArray) 的操作,它将不会被执行)。

  1. 使用 display_errors、error_reporting 关闭显示错误。好吧,这不是我在这里需要的,因为它仍然不允许我继续执行脚本并创建自定义错误处理程序。

  2. 我的 WP_DEBUG 设置为 FALSE

我不寻求什么样的建议 是手动编辑 max_upload_size、max_post_size 等。因为手动编辑服务器文件不符合插件理念。无论如何,即使您将最大上传大小设置为 10GB,最终用户也会尝试上传 11GB。

总而言之,众所周知,这种机制已在数以千计的网站和应用程序上实现,我想知道如何最大限度地提高我的脚本质量,在不过度使用和糟糕的用户体验的情况下处理这个问题。

感谢分享您的想法:)

UPD1如果有帮助,这是我的 AJAX 调用:

$('#post-assignment-answer').on('click', function (event) {
event.preventDefault();

tinymce.triggerSave();
var answerContent = tinymce.get('assignment_user_input_textarea').getContent();

var answerFile = $('#assignment-file-upload')[0].files[0];

var formData = new FormData();

formData.append('action', 'post_assignment_answer');
formData.append('security', lucid_single_assignment_params.post_assignment_answer_nonce);
formData.append('post_id', lucid_single_assignment_params.post_id);
formData.append('answer_content', answerContent);
formData.append('answer_file', answerFile);

$.ajax({
url: lucid_single_assignment_params.ajax_url,
type: 'post',
data: formData,
contentType: false,
processData: false,
success: function (result) {
console.log(result);
}
});
});

UPD2:添加 AJAX 处理 php

<?php

/**
* Post Assignment Answer
*
* @version 1.0.0
*/

if ( ! defined( 'ABSPATH' ) ) {
exit;
} // Exit if accessed directly

// Create AJAX call $result
$result = array(
'fileTypeError' => false,
'fileSizeError' => false,
'uploadError' => false
);

// Retrieving current post ID
$post_id = $_POST['post_id'];

// Retrieving WYSIWYG content
$answer_content = '';

if (! (trim($_POST['answer_content']) == '') ) {

$answer_content = wp_kses_post($_POST['answer_content']);

}

// Updating WYSIWYG meta field
update_post_meta($post_id, '_answer_content', $answer_content);

// Check if user intends to upload a file
if (!empty($_FILES['answer_file'])) {

// Adding timestamp to file name
$_FILES['answer_file']['name'] = round(microtime(true)) . '_' . $_FILES['answer_file']['name'];
$answer_file = $_FILES['answer_file'];

// Setting up uploaded file type validation
$supported_types = array(
'text/plain' // .txt
);

$arr_file_type = wp_check_filetype(basename($answer_file['name']));

$uploaded_type = $arr_file_type['type'];

// Setting up uploaded file size validation // TODO: This should be optimized
$allowed_size = 8388608;
$uploaded_size = $answer_file['size'];

// Validating, and in a case of success completing upload
if (!in_array($uploaded_type, $supported_types)) {

$result['fileTypeError'] = __('The type of file you\'ve provided is not allowed', 'lucidlms');

} elseif ($uploaded_size > $allowed_size) {

$result['fileSizeError'] = __('The size of file you\'ve provided is exceeding the maximum upload size', 'lucidlms');

} else {

/**
* Override the default upload path.
*
* @param array $dir
* @return array
*/
function lucidlms_assignment_upload_dir( $dir ) {
global $user_ID;

return array(
'path' => $dir['basedir'] . '/lucidlms/assignment/user' . $user_ID,
'url' => $dir['baseurl'] . '/lucidlms/assignment/user' . $user_ID,
'subdir' => ''
) + $dir;
}

// Register path override
add_filter( 'upload_dir', 'lucidlms_assignment_upload_dir' );

$upload = wp_handle_upload($answer_file, array( 'test_form' => false ));

// Set everything back to normal
remove_filter( 'upload_dir', 'lucidlms_user_upload_dir' );

if (isset($upload['error']) && $upload['error'] != 0) {

$result['uploadError'] = sprintf(__('There was an error uploading your file. The error is: %s', 'lucidlms'), $upload['error']);

} else {

// Check if there is an old version of file on the server and delete it
$existing_answer_file = get_post_meta($post_id, '_answer_file', true);
if (! empty($existing_answer_file)) {

global $user_ID;
$upload_dir = wp_upload_dir();
$existing_answer_file_name = pathinfo($existing_answer_file['file'], PATHINFO_BASENAME);
$unlink_path = $upload_dir['basedir'] . '/lucidlms/assignment/user' . $user_ID . '/' . $existing_answer_file_name;
unlink($unlink_path);

}

// Updating post meta
update_post_meta($post_id, '_answer_file', $upload);
}
}
}

wp_send_json($result);

最佳答案

请务必阅读并理解错误消息告诉您的内容:

exceeds the limit of XXXXX bytes in Unknown on line 0

错误在第 0 行报告,因为它是在 您的 PHP 代码开始执行之前抛出的。所以您无法更改接收 PHP 脚本中的行为。

正确的做法是检查数据的大小BEFORE you upload it (即在 Javascript 中)。但要注意:

  1. Javascript 在编码之前报告单个文件的大小 - Base64 编码增加了大约三分之一的开销,外加用于其他 POST 属性值和名称的空间。

  2. 为 post_max_size 配置的值是 PHP 接受的最大值。网络服务器(例如 apache )将接受的最大值可能会更低。对于插件来说,也许最合适的解决方案是允许管理员配置上限。

  3. 试图破坏您的安全的人可以轻松绕过 Javascript 中的任何检查

关于php - 妥善处理 "POST Content-Length of bytes exceeds the limit of"警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35746950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com