从 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 中的第二个示例)作为 CURLfile_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 的意思是使用包含图像 URLhttp://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 保存图像的主要内容,如果未能解决你的问题,请参考以下文章