Media: prevent uploading image types the server doesn’t support.

Normalize behavior between uploading in the media library and uploading directly to the block editor.  Now, when uploading an image with a mime type the server does not support (either in the media library or the block editor), the user will see an error message “This image cannot be processed by the web server. Convert it to JPEG or PNG before uploading”.

Alos, add a new filter `wp_prevent_unsupported_mime_type_uploads` which determines whether the server should prevent uploads for image types it doesn't support. The default value is true and the filter also receives the uploaded image mime type.

Props: joomskys, adamsilverstein, azaozz, swissspidy, joemcgill, flixos90, audrasjb. 

Fixes #61167


Built from https://develop.svn.wordpress.org/trunk@60084


git-svn-id: http://core.svn.wordpress.org/trunk@59420 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
Adam Silverstein
2025-03-25 14:07:53 +00:00
parent 0f97fb14d1
commit 6fd9b34405
3 changed files with 43 additions and 8 deletions

View File

@@ -2194,14 +2194,19 @@ function media_upload_form( $errors = null ) {
$plupload_init['multi_selection'] = false;
}
// Check if WebP images can be edited.
if ( ! wp_image_editor_supports( array( 'mime_type' => 'image/webp' ) ) ) {
$plupload_init['webp_upload_error'] = true;
}
/** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php */
$prevent_unsupported_uploads = apply_filters( 'wp_prevent_unsupported_mime_type_uploads', true, null );
// Check if AVIF images can be edited.
if ( ! wp_image_editor_supports( array( 'mime_type' => 'image/avif' ) ) ) {
$plupload_init['avif_upload_error'] = true;
if ( $prevent_unsupported_uploads ) {
// Check if WebP images can be edited.
if ( ! wp_image_editor_supports( array( 'mime_type' => 'image/webp' ) ) ) {
$plupload_init['webp_upload_error'] = true;
}
// Check if AVIF images can be edited.
if ( ! wp_image_editor_supports( array( 'mime_type' => 'image/avif' ) ) ) {
$plupload_init['avif_upload_error'] = true;
}
}
/**

View File

@@ -134,6 +134,36 @@ class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller {
array( 'status' => rest_authorization_required_code() )
);
}
$files = $request->get_file_params();
/**
* Filter whether the server should prevent uploads for image types it doesn't support. Default true.
*
* Developers can use this filter to enable uploads of certain image types. By default image types that are not
* supported by the server are prevented from being uploaded.
*
* @since 6.8.0
*
* @param bool $check_mime Whether to prevent uploads of unsupported image types.
* @param string|null $mime_type The mime type of the file being uploaded (if available).
*/
$prevent_unsupported_uploads = apply_filters( 'wp_prevent_unsupported_mime_type_uploads', true, isset( $files['file']['type'] ) ? $files['file']['type'] : null );
// If the upload is an image, check if the server can handle the mime type.
if (
$prevent_unsupported_uploads &&
isset( $files['file']['type'] ) &&
str_starts_with( $files['file']['type'], 'image/' )
) {
// Check if the image editor supports the type.
if ( ! wp_image_editor_supports( array( 'mime_type' => $files['file']['type'] ) ) ) {
return new WP_Error(
'rest_upload_image_type_not_supported',
__( 'The web server cannot generate responsive image sizes for this image. Convert it to JPEG or PNG before uploading.' ),
array( 'status' => 400 )
);
}
}
return true;
}

View File

@@ -16,7 +16,7 @@
*
* @global string $wp_version
*/
$wp_version = '6.8-beta3-60083';
$wp_version = '6.8-beta3-60084';
/**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.