我无法将一些 facebook 图片保存到我的服务器,因为它不理解该文件

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

我正在使用 facebook 图 api,它运行良好,直到我意识到某些 jpg 文件末尾有一个查询字符串,导致它们无法使用。

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

我曾尝试在 .jpg 之后剥离所有内容,希望它仍能加载图像,但不幸的是它没有。

在下面的代码中,将 $facebook_image_url 设为上面的代码。当 url 以 .jpg 结尾但在上面失败时,这工作正常。请注意,我将名称转换为随机数

        $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);

我收到的错误是

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

我可以确认图像没有保存为正确的 jpg,只是一个名为 1849974705.jpg(或其他随机数字)的 3KB 小文件

有没有

A:一种从 facebook 获取原始 jpg 图像的方法

B: 一种将它们成功转换为 jpg 的方法

仅仅因为 URI 中有 .jpg 并不意味着它是图像。

通过 wget 得到 URL 结果:

<!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>
    ....
    ....

即这不是图像,正如错误消息告诉您的那样。

您始终可以使用 file_get_contents()

下载图像

这段代码对我有用...

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"));