Opened 3 years ago
#55457 new defect (bug)
Function media_handle_sideload doesn't return with some pdf files due to Imagick
Reported by: |
|
Owned by: | |
---|---|---|---|
Milestone: | Awaiting Review | Priority: | normal |
Severity: | normal | Version: | 5.9.2 |
Component: | Upload | Keywords: | |
Focuses: | Cc: |
Description
I'm trying to upload procedurally some media with media_handle_sideload
, but some pdf files cause the execution flow to froze without media_handle_sideload
returning a value nor launching an Exception
.
This happens when the Imagick module is installed.
Environment
- OS: CentOS 7
- PHP Version: 7.4.28
- WordPress Version: 5.9.2
- Imagick Version: 6.9.10-68
Debug snippet
The bug can be verified calling the function alceo_handle_media_debug
<?php function alceo_handle_media_debug() { alceo_handle_media( 'https://life365.s3.eu-central-1.amazonaws.com/IT/p/11822/file/FilamentClear_2018.pdf' ); } function alceo_handle_media( $url ) { $path_info = pathinfo( parse_url( $url )['path'] ); $file_type = wp_check_filetype( $path_info['basename'] ); if ( ! $file_type['ext'] ) { return; } require_once( ABSPATH . 'wp-admin/includes/media.php' ); require_once( ABSPATH . 'wp-admin/includes/file.php' ); require_once( ABSPATH . 'wp-admin/includes/image.php' ); $media_title = $path_info['basename']; $tmp_name = download_url( $url ); if ( is_wp_error( $tmp_name ) ) { error_log( print_r( $tmp_name, true ) ); } $file = array( 'name' => $media_title, 'tmp_name' => $tmp_name, ); try { $media_id = media_handle_sideload( $file, 0, null, array( 'post_author' => 0, 'post_name' => sanitize_title( $media_title ), ) ); } catch ( \Exception $e ) { error_log( print_r( $e, true ) ); } if ( is_wp_error( $media_id ) ) { error_log( print_r( $tmp_name, true ) ); } }
Testing
I've tried to test adding these error_log
lines into method pdf_load_source
of class WP_Image_Editor_Imagick
(file wp-includes/class-wp-image-editor-imagick.php
)
<?php class WP_Image_Editor_Imagick extends WP_Image_Editor { // ... protected function pdf_load_source() { error_log( "Into pdf_load_source" ); $filename = $this->pdf_setup(); error_log( "Filename: " . print_r( $filename, true ) ); if ( is_wp_error( $filename ) ) { return $filename; } try { error_log( "Trying with " . print_r( $this->image, true ) ); // When generating thumbnails from cropped PDF pages, Imagemagick uses the uncropped // area (resulting in unnecessary whitespace) unless the following option is set. $this->image->setOption( 'pdf:use-cropbox', true ); error_log( "Option use cropbox true" ); // Reading image after Imagick instantiation because `setResolution` // only applies correctly before the image is read. $this->image->readImage( $filename ); error_log( "Image read tried" ); } catch ( Exception $e ) { error_log( "Catched" ); // Attempt to run `gs` without the `use-cropbox` option. See #48853. $this->image->setOption( 'pdf:use-cropbox', false ); error_log( "Option use cropbox false" . print_r( '', true ) ); $this->image->readImage( $filename ); error_log( "Image read" . print_r( '', true ) ); } return true; } // ... }
with this result in debug.log
:
[23-Mar-2022 14:36:23 UTC] Into pdf_load_source [23-Mar-2022 14:36:23 UTC] Filename: /<host_path>/wp-content/uploads/2022/03/Product-XXXXX-FilamentClear_2018-1.pdf[0] [23-Mar-2022 14:36:23 UTC] Trying with Imagick Object ( ) [23-Mar-2022 14:36:23 UTC] Option use cropbox true
And none of the following error_log
prints coming after this last line.
Other details
- This happens with some pdf files (the one from the url in the code being one of them)
- I've tried changing php version to the latest 8.1, but the issue persists
Note: See
TracTickets for help on using
tickets.