2013-02-14 77 views
0

我使用下面的代码将图像从url复制到我的web目录的功能,但我不知道为什么有些图像不能100%复制。从url复制后不是精确的图像复制

这里是我的web目录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); 
    } 
} 

我也试过,卷曲,但它仍然无法正常复制一些图片。

卷曲代码:

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

虽然不只是file_put_contents而不是fopen/fwrite? – 2013-02-14 21:45:04

+1

您可能只需指定“wb +”作为标志。 b表示二进制模式。这可能是原因。它可能认为它是一个文本文件。 – 2013-02-14 21:46:52

+0

“wb +”和file_put_contents不起作用到 – Marek 2013-02-14 22:16:24

回答

0

你的功能工作正常

只要删除旧的图像,并尝试重新下载。

还补充:

fclose($file); 
+0

不能用fclose – Marek 2013-02-14 22:16:49

-2

尝试增加的set_time_limit(0)在函数的beggining

+0

它只有一个〜50K的文件,这个怎么办? – craig1231 2013-02-14 21:42:46

+0

它可能没有帮助,但肯定会排除脚本在文件关闭前被杀的远程可能性。 – horatio 2013-02-14 21:50:50

+0

不起作用 – Marek 2013-02-14 22:18:27

0

我不知道到底是什么,你的问题的原因,但我面临着类似的问题与文件搬运和我解决它使用这种方法:

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

?> 
+0

不适用于 – Marek 2013-02-14 22:18:03

+0

您使用了哪一部分?你得到了什么错误?你能提供你的试用吗? – 2013-02-14 22:28:55

+0

我已经试过这个第一个你的代码,并没有任何错误,只是仍然不是确切的图像副本。我也试过CURL,它仍然有一些图像是好的,有些则没有。 – Marek 2013-02-14 22:32:57

0

我找到怎样的方式来做到这一点,因此,如果任何一个已经得到了类似的问题我的,他可以尝试使用此功能:

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