I cant save some facebook images to my server as it does not understand the file

一世执手 提交于 2019-12-30 14:09:22

问题


I am using the facebook graph api and it was working well until I realised that some of the jpg files have a query string at the end that is making them unusable.

e.g. https://scontent.xx.fbcdn.net/hphotos-xaf1/v/t1.0-9/487872_451835128174833_1613257199_n.jpg?oh=621bed79f5436e81c3e219c86db8f0d9&oe=560F3D0D

I have tried stripping off everything after .jpg in the hope that it would still load the image but unfortunately it doesnt.

In the following code take the $facebook_image_url to be the one above. This works fine when the url ends in .jpg but fails on the above. As a note, I am converting the name to a random number

        $File_Name          = $facebook_image_url;
        $File_Ext           = '.jpg'; 
        $Random_Number      = rand(0, 9999999999); //Random number to be added to name.
        $NewFileName        = $Random_Number.$File_Ext; //new file name


        $local_file = $UploadDirectory.$NewFileName;
        $remote_file = $File_Name;
        $ch = curl_init();
        $fp = fopen ($local_file, 'w+');
        $ch = curl_init($remote_file);
        curl_setopt($ch, CURLOPT_TIMEOUT, 50);
        curl_setopt($ch, CURLOPT_FILE, $fp);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_ENCODING, "");
        curl_exec($ch);
        curl_close($ch);
        fclose($fp);

        $image = new Imagick(DIR_TEMPORARY_IMAGES.$NewFileName);

The error Im getting is

Fatal error: Uncaught exception 'ImagickException' with message 'Not a JPEG file: starts with 0x3c 0x21 `/mysite/temp-images/1849974705.jpg' @ jpeg.c/EmitMessage/232'

I can confirm the image isnt saving as a proper jpg, just a small 3KB file with the name 1849974705.jpg (or other random numbers)

Is there either

A: A way of getting those images from facebook as raw jpg

or

B: A way of converting them succesfully to jpgs


回答1:


You could always download the image using file_get_contents()

This code works for me...

file_put_contents("image.jpg", file_get_contents("https://scontent.xx.fbcdn.net/hphotos-xaf1/v/t1.0-9/522827_10152235166655545_26514444_n.jpg?oh=1d52a86082c7904da8f12920e28d3687&oe=5659D5BB"));



回答2:


Just because something has .jpg in the URI doesn't mean it's an image.

Getting that URL via wget gives the result:

<!DOCTYPE html>
<html lang="en" id="facebook">
  <head>
    <title>Facebook | Error</title>
    <meta charset="utf-8">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="cache-control" content="no-store">
    <meta http-equiv="cache-control" content="max-age=0">
    <meta http-equiv="expires" content="-1">
    <meta http-equiv="pragma" content="no-cache">
    <meta name="robots" content="noindex,nofollow">
    <style>
    ....
    ....

i.e. it's not an image, exactly as the error message is telling you.



来源:https://stackoverflow.com/questions/31572292/i-cant-save-some-facebook-images-to-my-server-as-it-does-not-understand-the-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!