PHP检索并保存远程图像

时间:2011-09-10 22:10:49

标签: php

使用以下方法在PHP中检索文件我继续点击反链接安全图片而不是我正在寻找的图像。奇怪的是,当我在Firefox / IE或者Internet Download Manager中手动输入url时,我确实得到了正确的文件,所以到目前为止我尝试过的方法一定有问题。

file_put_contents:

file_put_contents($localpath, file_get_contents($remoteURL));

以下功能也不起作用:

function save_image($inPath,$outPath)
{ //Download images from remote server
    $in=    fopen($inPath, "rb");
    $out=   fopen($outPath, "wb");
    while ($chunk = fread($in,8192))
    {
        fwrite($out, $chunk, 8192);
    }
    fclose($in);
    fclose($out);
}
save_image($remoteURL,$localpath);

和fopen()

$tag = fopen($remoteURL, 'rb');

if($tag){
 while(!feof($tag)) {
     $imgt = $imgt . fread($tag, 1024);
 }
} 

和imagecreatefromjpeg()没有做到这一点

function LoadJpeg($imgname)
{
    /* Attempt to open */
    $im = @imagecreatefromjpeg($imgname);

    /* See if it failed */
    if(!$im)
    {
        /* Create a black image */
        $im  = imagecreatetruecolor(150, 30);
        $bgc = imagecolorallocate($im, 255, 255, 255);
        $tc  = imagecolorallocate($im, 0, 0, 0);

        imagefilledrectangle($im, 0, 0, 150, 30, $bgc);

        /* Output an error message */
        imagestring($im, 1, 5, 5, 'Error loading ' . $imgname, $tc);
    }

    return $im;
}

我还有其他选择吗?

3 个答案:

答案 0 :(得分:1)

如果这不是您的网站,那么您几乎无能为力。该网站已设置为阻止人们删除图片或在链接中使用图片。

但是,您可以使用curl语句而不是file_get_contents,如果不起作用,请使用curl向请求发送一些浏览器标头。

如果这是您的网站,如果您在cPanel上运行,则安全部分中有一个选项。我忘了确切的位置。

答案 1 :(得分:1)

由于您写道allow_url_fopenon并且功能不起作用,您可以试试卷曲。

function save_image($inPath,$outPath){
    $ch = curl_init ($inPath);
    curl_setopt($ch, CURLOPT_HEADER, 0); // required
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1); // required for images
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // maybe redirect on other side?
    curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3'); // or user agent checks?
    $rawdata=curl_exec($ch);
    curl_close ($ch);
    if(file_exists($outPath)){
        @unlink($outPath);
    }
    $fp = fopen($outPath,'x');
    fwrite($fp, $rawdata);
    fclose($fp);
}

答案 2 :(得分:0)

他们可能有一些检查,他们可能会得到用户代理,引用。尝试将此用于fake浏览器的行为