从PHP URL保存图像


402

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


1
如果复制量大或文件的大小,注意CURL方法是优选的(如在该第二实施例接受的答案),为CURL大约需要的时间的三分之一file_put_contents等等
ashleedawg

Answers:


712

如果您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);

1
谢谢兄弟,您的代码可以帮助我解决问题。但是您能否帮助我使脚本自动化。我的意思是,当新的gif图像进入url(“ example.com/image.php ”)时,我们的脚本会自动获取新图像并将其存储到我的目录中?
RIAD

32
您怎么知道新图像“出现了”?
vartec

2
我认为riad意味着使用$_GET包含图像URL的变量http://example.com/fetch-image.php?url=http://blabla.com/flower.jpg。在此示例中,您可以只调用$_GET['url']PHP脚本,如下所示:$ch = curl_init($_GET['url']);
Mathias Bynens 09年

4
+1是我见过的唯一答案,其中包括二进制标志“ b”。
摩根(Morgan)

34
@vartec:因为它在抽烟,脸上露出灿烂的笑容:)
Jimbo,

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

42
非常优雅(需要allow_url_fopen)。
Iiridayn

我没有去尝试,只是添加它,以便将来任何用户访问此页面时,他们都会看到:)但是,这是一个非常优雅的解决方案
AlexMorley-Finch 2012年

60
请忽略我的评论,此功能非常适合透明效果。我的标头被硬编码为image / jpeg。
AlexMorley雀

2
如果目标文件夹不存在,会自动创建吗?
蒙斯特,2015年

3
@Monnster,不,它不适用于普通文件系统。
HalilÖzgür2015年

69
$content = file_get_contents('http://example.com/image.php');
file_put_contents('/my/folder/flower.jpg', $content);

该页面包含动画gif图像。文件以flower.gif的形式存储到文件夹中,但是为空白。没有图像显示。有解决方案吗?
RIAD

打开error_reporting(E_ALL | E_STRICT)并检查file_get_contents()的返回值,然后应该得到一条合理的错误消息。
soulmerge

也许网站管理员禁止外部推荐。在这种情况下,您可以尝试stream_context_create()并设置适当的HTTP标头。us2.php.net/manual/en/function.stream-context-create.php
加尔文(Calvin)

urlencode(' example.com/image.php')=='http%3A%2F%2Fexample.com%2Fimage.php',显然不是您想要的。另外文件是二进制的,需要设置适当的标志。
vartec

4
有点陈旧...但是不要忘记要保存到的目录的文件权限。仅仅浪费了十分钟就忘记了显而易见的事情。
斯奎格斯。

29

在这里,该示例将远程图像保存到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。
安德鲁(Andrew)

9
图像或文件扩展名的生成与问题有什么关系?
Sam152

fopen也需要allow_url_fopen = 1
zloctb

PHP文档中的 @SamThompson 表示块大小(通常为8192)。
大安

AFAIK fread可能返回比请求的8K更短的块。您不需要计算fwrite的有效块长度吗?
谢尔盖

25

Vartec使用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);

1
感谢zuul,真的&stoe在经过更多搜索或花时间后才真正有所帮助
Rakesh Sharma

辉煌-起到了很大的作用!在Vartecs答案中也应注意
尼克

10

我无法使用其他任何解决方案,但可以使用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');
}

该解决方案也是唯一对我有用的解决方案。谢谢安德鲁!
sentinel777

4

参见file()PHP手册

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

2
需要allow_url_fopen =开
zloctb

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

1

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


0
$data = file_get_contents('http://example.com/image.php');
$img = imagecreatefromstring($data);
imagepng($img, 'test.png');

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.