我有一个允许用户上传图像的表单。我使用下面的代码(目前不起作用)来确保用户上传的内容是有效的。
是否有人可以帮助我更新代码或为我指出正确的方向,告诉我如何使用尽可能多的内置WordPress函数(wp\\u check\\u filetype\\u and\\u ext())或任何其他适合的函数来处理验证?它还必须是安全的,以防止任何恶意文件、攻击等。
if ( $_FILES ) {
foreach ($_FILES as $file => $array) {
//Check if the $_FILES is set and if the size is > 0 (if =0 it\'s empty)
if ( isset( $_FILES[$file]) && ($_FILES[$file][\'size\'] > 0 ) ) {
$tmpName = $_FILES[$file][\'tmp_name\'];
list($width, $height, $type, $attr) = @getimagesize($tmpName);
if ($width != 500 || $height != 500) {
$error .= "Image is to small<br />";
unlink($_FILES[$file][\'tmp_name\']);
}
// Get the type of the uploaded file. This is returned as "type/extension"
$arr_file_type = wp_check_filetype(basename($_FILES[$file][\'name\']));
$uploaded_file_type = $arr_file_type[\'type\'];
// Set an array containing a list of acceptable formats
$allowed_file_types = array(\'image/jpg\',\'image/jpeg\',\'image/gif\',\'image/png\');
// If the uploaded file is the right format
if (in_array($uploaded_file_type, $allowed_file_types)) {
} else { // wrong file type
$error .= "Please upload a JPG, GIF, or PNG file<br />";
}
}
}
}
SO网友:Tom J Nowell
问题中的所有代码都可以替换为:
require_once( ABSPATH . \'wp-admin/includes/image.php\' );
require_once( ABSPATH . \'wp-admin/includes/file.php\' );
require_once( ABSPATH . \'wp-admin/includes/media.php\' );
if ( $_FILES ) {
foreach ($_FILES as $file => $array) {
$image_post_id = media_handler_upload( $file );
if ( is_wp_error( $image_post_id ) ) {
$error .= $image_post_id->get_error_message();
} else {
// $image_post_id now holds the post ID of an attachment that is your uploaded file
}
}
}
的力量
media_handle_upload
意味着现在您已经完全将安全性、检查和上载外包给WordPress Core。
media_handle_upload
将在您完成项目后很长一段时间内由比我们都聪明得多的人以及其他在维护WordPress安全方面有既得利益的人维护。
media_handle_upload
将执行通过仪表板上载内容时得到的所有检查,并将创建附件帖子以在数据库中表示这些上载的文件。它还将处理不同图像大小的创建、与插件的兼容性,并遵守仪表板中指定的安全设置。
如果成功,它将返回其创建的附件帖子的ID。如果不成功,它将返回WP_Error
对象,并显示错误消息。
然后您可以使用wp_get_attachment_url
如果您需要附件的完整URL,或wp_get_attachment_image_src
如果需要获取图像的特定大小,例如:
$image = wp_get_attachment_image_src( $image_post_id, \'thumbnail\' );
if ( $image != false ) {
echo $image[0];
}