从 PHP URL 保存图像

Posted

技术标签:

【中文标题】从 PHP URL 保存图像【英文标题】:Saving image from PHP URL 【发布时间】:2010-10-17 23:40:02 【问题描述】:

我需要将图像从 php URL 保存到我的 PC。 假设我有一个页面,http://example.com/image.php,只有一个“花”图像,没有别的。如何使用新名称(使用 PHP)从 URL 中保存此图像?

【问题讨论】:

如果复制大量或大量文件,请注意 CURL 方法更可取(如 accepted answer 中的第二个示例)作为 CURL file_put_contents 等大约需要三分之一的时间。 【参考方案1】:

使用PHP的函数copy():

copy('http://example.com/image.php', 'local/folder/flower.jpg');

注意:这需要allow_url_fopen

【讨论】:

非常优雅(需要allow_url_fopen)。 请忽略我的 cmets,此功能与透明度完美配合。我将标题硬编码为 image/jpeg。 无法建立连接,因为目标机器主动拒绝。 :( 如果目标文件夹不存在,是否会自动创建? @Monnster,不,它不适用于普通文件系统。【参考方案2】:

这里的答案都没有提到可以压缩 URL 图像 (gzip) 的事实,并且在这种情况下它们都不起作用。

有两种解决方案可以解决这个问题:

首先是使用cURL方法,设置curl_setoptCURLOPT_ENCODING, ''

// ... image validation ...

// Handle compression & redirection automatically
$ch = curl_init($image_url);
$fp = fopen($dest_path, 'wb');

curl_setopt($ch, CURLOPT_FILE, $fp);
// Exclude header data
curl_setopt($ch, CURLOPT_HEADER, 0);
// Follow redirected location
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
// Auto detect decoding of the response | identity, deflate, & gzip
curl_setopt($ch, CURLOPT_ENCODING, '');

curl_exec($ch);

curl_close($ch);
fclose($fp);

它有效,但从数百个不同图像(png、jpg、ico、gif、svg)的测试来看,它并不是最可靠的方法。

最好的方法是检测图像 url 是否具有内容编码(例如 gzip):

// ... image validation ...

// Fetch all headers from URL
$data = get_headers($image_url, true);

// Check if content encoding is set
$content_encoding = isset($data['Content-Encoding']) ? $data['Content-Encoding'] : null;

// Set gzip decode flag
$gzip_decode = ($content_encoding == 'gzip') ? true : false;

if ($gzip_decode)

    // Get contents and use gzdecode to "unzip" data
    file_put_contents($dest_path, gzdecode(file_get_contents($image_url)));

else

    // Use copy method
    copy($image_url, $dest_path);

有关 gzdecode see this thread 的更多信息。到目前为止,这工作正常。如果有什么可以做得更好的,请在下面的 cmets 中告诉我们。

【讨论】:

【参考方案3】:

在您的服务器上安装 wkhtmltoimage,然后使用我的包 packagist.org/packages/tohidhabiby/htmltoimage 从您的目标网址生成图像。

【讨论】:

这是创建网站的图像,而不是在本地保存远程图像【参考方案4】:
$data = file_get_contents('http://example.com/image.php');
$img = imagecreatefromstring($data);
imagepng($img, 'test.png');

【讨论】:

【参考方案5】:

file()PHP Manual:

$url    = 'http://mixednews.ru/wp-content/uploads/2011/10/0ed9320413f3ba172471860e77b15587.jpg';
$img    = 'miki.png';
$file   = file($url);
$result = file_put_contents($img, $file)

【讨论】:

需要 allow_url_fopen = 开启【参考方案6】:

Vartec's answer 和 cURL 对我不起作用。确实如此,由于我的具体问题略有改善。

例如,

当服务器上存在重定向时(例如当您尝试保存 facebook 个人资料图片时),您将需要设置以下选项:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

完整的解决方案变成:

$ch = curl_init('http://example.com/image.php');
$fp = fopen('/my/folder/flower.gif', 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
curl_close($ch);
fclose($fp);

【讨论】:

感谢 zuul,经过更多搜索或花费时间后,真的和 stoe 真的很有帮助 太棒了——这帮了大忙!也应该在 Vartecs 的答案中注明【参考方案7】:
$img_file='http://www.somedomain.com/someimage.jpg'

$img_file=file_get_contents($img_file);

$file_loc=$_SERVER['DOCUMENT_ROOT'].'/some_dir/test.jpg';

$file_handler=fopen($file_loc,'w');

if(fwrite($file_handler,$img_file)==false)
    echo 'error';


fclose($file_handler);

【讨论】:

【参考方案8】:

在您计划放置要创建的 php 脚本的路径中创建一个名为 images 的文件夹。确保它对每个人都有写权限,否则脚本将无法工作(它将无法将文件上传到目录中)。

【讨论】:

【参考方案9】:

我无法使用任何其他解决方案,但我能够使用 wget:

$tempDir = '/download/file/here';
$finalDir = '/keep/file/here';
$imageUrl = 'http://www.example.com/image.jpg';

exec("cd $tempDir && wget --quiet $imageUrl");

if (!file_exists("$tempDir/image.jpg")) 
    throw new Exception('Failed while trying to download image');


if (rename("$tempDir/image.jpg", "$finalDir/new-image-name.jpg") === false) 
    throw new Exception('Failed while trying to move image file from temp dir to final dir');

【讨论】:

这个解决方案也是唯一对我有用的解决方案。谢谢安德鲁!【参考方案10】:

如果您将allow_url_fopen 设置为true

$url = 'http://example.com/image.php';
$img = '/my/folder/flower.gif';
file_put_contents($img, file_get_contents($url));

其他使用cURL:

$ch = curl_init('http://example.com/image.php');
$fp = fopen('/my/folder/flower.gif', 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);

【讨论】:

谢谢兄弟,你的代码帮我解决了这个问题。但是你能帮我使脚本自动化吗?我的意思是当一个新的 gif 图像到达 url(“example.com/image.php”)时,我们的脚本会自动获取新图像并将其存储到我的目录中? 你怎么知道,新图像“来了”? 我认为 riad 的意思是使用包含图像 URL http://example.com/fetch-image.php?url=http://blabla.com/flower.jpg$_GET 变量。在本例中,您可以在 PHP 脚本中调用 $_GET['url'],如下所示:$ch = curl_init($_GET['url']); +1 是我见过的唯一答案,其中包含二进制标志的“b”。 @vartec:因为它正在抽着烟,脸上挂着灿烂的笑容:)【参考方案11】:

到这里,示例将远程图像保存到 image.jpg。

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('http://www.someimagesite.com/img.jpg','image.jpg');

【讨论】:

伙计们的网址是example.com/image.php。请注意,它是 php 生成的图像,而不是简单的 jpeg。 图像或文件扩展名的生成与问题有什么关系? fopen 也需要 allow_url_fopen=1 @SamThompson 来自PHP documentation,表示块大小(通常为 8192)。 AFAIK fread 可能返回比请求的 8K 更短的块。 fwrite不需要计算有效块长度吗?【参考方案12】:
$content = file_get_contents('http://example.com/image.php');
file_put_contents('/my/folder/flower.jpg', $content);

【讨论】:

该页面包含一个动画 gif 图像。一个文件作为flower.gif 存储到文件夹中。但它是空白的。没有图像显示。任何解决方案? 开启error_reporting(E_ALL|E_STRICT),查看file_get_contents()的返回值,应该会得到合理的错误信息。 也许网站管理员已经禁止外部推荐。在这种情况下,您可以尝试 stream_context_create() 并设置适当的 HTTP 标头。 us2.php.net/manual/en/function.stream-context-create.php urlencode('example.com/image.php') == 'http%3A%2F%2Fexample.com%2Fimage.php',显然不是你想要的。文件也是二进制的,需要设置正确的标志。 有点旧线程...但不要忘记您要保存到的目录的文件权限。只是浪费了十分钟忘记了显而易见的事情。

以上是关于从 PHP URL 保存图像的主要内容,如果未能解决你的问题,请参考以下文章

使用PHP从远程服务器获取并保存/缓存图像

python从url保存图像

将 php 脚本的图像输出保存为文件

如何从 PHAsset 获取图像 URL?是不是可以使用 PHAsset URL 将图像保存到文档目录?

通过回形针从 URL 保存图像

Android - 在显示进度时将图像从 URL 加载到 ImageView(不保存图像)