【问题标题】:not exact image copy after copying from url从 url 复制后不精确的图像复制
【发布时间】:2013-02-14 21:35:15
【问题描述】:

我正在使用带有以下代码的函数将图像从 url 复制到我的 web 目录,但我不知道为什么有些图像没有 100% 复制。

这是我的网络目录中错误图像的副本http://www.aligatoor.pl/uploads/deals/2632b3802e8ed7abe83788dab605bbf7.jpg

这里是原图http://infobuzer.pl/img/r4d3k/voucher/50e35a84c9038.jpg

function upload_file($file_path)
{
    $deal_img_data=file_get_contents($file_path);

    $file_name=md5($file_path).".jpg";

    if(!file_exists($file_name))
    {
        $file=fopen($file_name,"w+");

        fwrite($file,$deal_img_data);
    }
}

我也尝试过使用 CURL,但它仍然无法正确复制一些图像。

CURL 代码:

$ch = curl_init ($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
$raw=curl_exec($ch);
curl_close ($ch);
$saveto=md5($url).".jpg";
if(file_exists($saveto)){
    unlink($saveto);
}
$fp = fopen($saveto,'x');
fwrite($fp, $raw);
fclose($fp);

【问题讨论】:

  • 而不仅仅是 file_put_contents 而不是 fopen/fwrite?
  • 您可能只需要指定“wb+”作为标志。 b 表示二进制模式。这可能是原因。它可能认为它是一个文本文件。
  • "wb+" 和 file_put_contents 不起作用
  • 我也试过 curl 还是一样的问题。

标签: php file-upload file-get-contents


【解决方案1】:

你的功能运行良好

只需删除旧图像并尝试重新下载即可。

还要补充:

fclose($file);

【讨论】:

    【解决方案2】:

    我不确切知道您的问题的原因是什么,但我在文件处理方面遇到了类似的问题,我使用这种方法解决了它:

      if( $handle =fopen($filename, "wb+") ){
        if(flock($handle, LOCK_EX))
        {
          fseek($handle, 0); 
          ftruncate($handle, 0); 
    
          fwrite($handle, $newcontent);
    
          fflush($handle); 
          flock($handle, LOCK_UN); 
        }
        fclose($handle); 
      }
    

    FLOCK()

    编辑:为了处理图像,最好使用图像功能,例如 imagejpeg()imagecreatefromjpeg(),以获得更好的安全性和准确的结果。

    示例:

      $im = @imagecreatefromjpeg($image);
      if(is_bool($im)){
       die("Invalid Image detected!");
      }
      else{
    
        if(!imagejpeg($im, $newpath)){
         die("Image not saved!");
        }
        else{
         die("Image saved!");
        }  
      }
    

    Edit2:添加这个而不是使用 file_get_contents()

    <?php
    
    $handle = fopen($file_path, "rb");
    $deal_img_data = stream_get_contents($handle);
    fclose($handle);
    
    ?> 
    

    【讨论】:

    • 你用的是哪一部分?你有什么错误?你能提供你的试用吗?
    • 我首先尝试了你的代码,没有任何错误,只是图像的副本仍然不准确。我也尝试过使用 CURL,但有些图像还可以,有些则不行。
    • 使用更新的部分,否则可能是您的网络连接、缓存或托管系统问题。
    • 还是同样的问题..我有自己的专用服务器,所以如果你知道服务器配置可能导致这个问题的原因,请告诉我。我不认为这是一个网络连接,因为我发现问题总是出在相同的图像上。
    【解决方案3】:

    我找到了方法,所以如果有人和我有类似的问题,他可以尝试使用这个功能:

    function grab_image($url){
        $ch = curl_init ($url);
        $saveto = md5($url).".jpg";
        $fp = fopen($saveto,'wb');
        curl_setopt($ch, CURLOPT_FILE, $fp);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_exec($ch);
        curl_close($ch);
        fclose($fp);
    }
    

    【讨论】:

      【解决方案4】:

      尝试在函数开头添加 set_time_limit(0)

      【讨论】:

      • 它只有一个大约 50K 的文件,这有什么帮助?
      • 它可能没有帮助,但肯定会排除脚本在文件关闭之前被杀死的可能性。
      猜你喜欢
      • 2012-06-28
      • 2014-09-18
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      相关资源
      最近更新 更多