Support » Developing with WordPress » wordpress wp_ajax_[ACTION] display a broken image

  • Resolved QwqOffice

    (@ooqwqoo)


    I used a single .php file to display a resized image in wordpress before and it is work fine, this is my code:

    if(isset($_GET['src'])){
        $src = urldecode($_GET['src']);
    }else{
        exit;
    }
    $width = 300;
    $height = 300;
    
    resizeImg($src,$width,$height);
    
    function resizeImg($src,$width,$height){
        $arr = getimagesize($src);  
    
        header("Content-type: image/png");
        $ext = pathinfo($src, PATHINFO_EXTENSION);
        switch(strtolower($ext)){
            case 'jpg':
            case 'jpeg':
                $src = imagecreatefromjpeg($src);
                break;
            case 'gif':
                $src = imagecreatefromgif($src);
                break;
            case 'png':
                $src = imagecreatefrompng($src);
                break;
            case 'wbmp':
                $src = imagecreatefromwbmp($src);
                break;
            default:
                exit;
        }
        //$src = imagecreatefromjpeg($src);
        $image = imagecreatetruecolor($width, $height);
        $bg = imagecolorallocate($image, 255, 255, 255);
        imagefill($image, 0, 0, $bg);
        imagecopyresampled($image, $src, 0, 0, 0, 0, $width, $height, $arr[0], $arr[1]);
        imagepng($image);
        imagedestroy($image);
    }

    The image link is:
    http://localhost/wordpress/wp-content/plugins/wechatshare/ws-resize.php?src=http%3A%2F%2Flocalhost%2Fwordpress%2Fwp-content%2Fuploads%2F2016%2F09%2F343.jpg

    And now I use wordpress hook wp_ajax_[ACTION] to display it:

    add_action( 'wp_ajax_nopriv_resize_img', 'ws_resize_img' );
    add_action( 'wp_ajax_resize_img', 'ws_resize_img' );
    
    //resize
    function ws_resize_img(){
        if(isset($_GET['src'])){
            $src = urldecode($_GET['src']);
        }else{
            exit;
        }
    
        $width = 300;
        $height = 300;
        $arr = getimagesize($src);  
    
        header("Content-type: image/png");
        $ext = pathinfo($src, PATHINFO_EXTENSION);
        switch(strtolower($ext)){
            case 'jpg':
            case 'jpeg':
                $src = imagecreatefromjpeg($src);
                break;
            case 'gif':
                $src = imagecreatefromgif($src);
                break;
            case 'png':
                $src = imagecreatefrompng($src);
                break;
            case 'wbmp':
                $src = imagecreatefromwbmp($src);
                break;
            default:
                exit;
        }
        //$src = imagecreatefromjpeg($src);
        $image = imagecreatetruecolor($width, $height);
        $bg = imagecolorallocate($image, 255, 255, 255);
        imagefill($image, 0, 0, $bg);
        imagecopyresampled($image, $src, 0, 0, 0, 0,$width,$height,$arr[0], $arr[1]);
        imagepng($image);
        imagedestroy($image);
    
        exit;
    }

    The image link is:
    http://localhost/wordpress/wp-admin/admin-ajax.php?action=resize_img&src=http%3A%2F%2Flocalhost%2Fwordpress%2Fwp-content%2Fuploads%2F2016%2F09%2F343.jpg

    But I get a broken image.
    And who can tell me why?

Viewing 8 replies - 1 through 8 (of 8 total)
  • Your example pages aren’t accessable via the Internet. Localhost only shows up on your machine.

    Have you enabled wp_debug? I feel like a PHP error is being thrown that you don’t see. Namely, an error like ‘headers already sent’.

    See about wp_debug:

    https://codex.wordpress.org/Debugging_in_WordPress

    Moderator bcworkz

    (@bcworkz)

    Right, headers already sent would be one problem. A larger problem is single.php is sending HTML page data in response to a request from the browser. The browser is expecting this sort of response. It understands MIME types and image data streams.

    In AJAX, the browser is not expecting a response, it requested nothing. It was jQuery script that made the request, and it is not expecting HTML page data or an image data stream in response, it is expecting data that can be assigned to a JS variable. It generally does not understand MIME types and image data streams.(dedicated add-on libraries might though) Data from that variable can then be used to alter a DOM element. DOM elements do not handle image data streams themselves, that is relegated to internal browser code, which is not expecting any data.

    For example, jQuery can alter an img tag’s src attribute and the browser will fetch the new image’s data stream. AFAIK jQuery or a DOM element cannot do anything with an image’s data stream itself.

    jkovis

    (@jkovis)

    I have a feeling that your wp_ajax actions are not being added/fired…where are your add_action( 'wp_ajax_ code and ws_resize_img function located?

    When I tested your code I received a 300×300 png image using a larger jpg source file. To do so I put your code into my theme’s functions.php file which is always included in every WordPress request. You might want to make sure your code is there or in its own plugin.

    Thread Starter QwqOffice

    (@ooqwqoo)

    @jkovis add_action( 'wp_ajax_' code and ws_resize_img function are located in my plugin, and I make sure wp_ajax is fired. I cut the code and put into theme’s functions.php but I still received a broken image and no any PHP error.

    Thread Starter QwqOffice

    (@ooqwqoo)

    @jdabber I enabled WP_DEBUG but I not received any PHP error in logs.

    jkovis

    (@jkovis)

    Can you confirm that you’re running the code in the same environment/server as the non-wp_ajax version? When I tried your code I had to install GD to get it to work, but it sounds like that’s not the issue since you had it working before.

    What do the admin-ajax.php response headers look like? Is the Content-type header sent as image/png?

    Lastly, you might want to start adding some error_log() calls like this to your ws_resize_img function in order to try and narrow down where it’s breaking:

    
    $log = print_r( array(
    	'file'  => __FILE__ . ' on line ' . __LINE__,
    	'src'   => isset( $_GET['src'] ) && ! empty( $_GET['src'] ) ? urldecode( $_GET['src'] ) : 'not set/empty',
    	'arr'   => $arr,
    	'ext'   => $ext,
    	'image' => $image
    ), true );
    error_log( $log );
    

    I hope that helps and am interested to learn what’s causing the problem.

    Thread Starter QwqOffice

    (@ooqwqoo)

    @jkovis I compared the broken image response data to the normal one and I found some unexpected chars at the beginning of the broken image data. I deactived the plugin which output chars and then everything is fine.

    Thread Starter QwqOffice

    (@ooqwqoo)

    This is the solution:
    add the following code before header("Content-type: image/png");

    ob_get_clean();
    ob_clean();

    to clean the output to get the intact image.

    • This reply was modified 4 years ago by QwqOffice.
Viewing 8 replies - 1 through 8 (of 8 total)
  • The topic ‘wordpress wp_ajax_[ACTION] display a broken image’ is closed to new replies.