我有一个PHP脚本从远程服务器获取图像,以便我可以使用HTML5 canvas API对其进行操作。
<?php
if ((isset($_GET['url']))) {
$url = $_GET['url'];
$file_format = pathinfo($url, PATHINFO_EXTENSION);
try
{
header("Content-Type: image/$file_format");
header("Content-disposition: filename=image.$file_format");
$img = file_get_contents($url);
echo $img;
}
catch(Exception $e)
{
echo $e->getMessage();
}
}
else die('Unknown request');
?>
典型的请求如下所示:
fetch_image.php?url=http://example.com/images/image.png
我的本地服务器上的一切正常,但生产服务器给我这个错误:
NetworkError:500内部服务器错误。
错误日志注册此消息:
PHP警告:无法修改标头信息 - 已发送的标头。
我已经尝试了一些建议,但它不起作用:
allow_url_fopen = 1
答案 0 :(得分:11)
检查服务器是否允许您使用文件功能打开远程URL(php.ini“allow_url_fopen”设置必须为“true”)。
答案 1 :(得分:1)
尝试
ob_start()
在开头和
ob_end_flush()
在脚本的末尾。另外,请确保脚本在<?php
之前不包含任何字符。
答案 2 :(得分:1)
出于安全原因,您应确保您的托管服务提供商未禁用远程URL提取。设置为allow_url_fopen
,您可以使用phpinfo()检查当前配置。在这种情况下,file_get_contents()应该返回FALSE
,因此您必须使用$img
运算符对===
进行错误测试。
答案 3 :(得分:1)
试试这种方式
<?php
if ((isset($_GET['url']))) {
$url = $_GET['url'];
$file_format = pathinfo($url, PATHINFO_EXTENSION);
try
{
ob_clean();
ob_start();
header("Content-Type: image/$file_format");
header("Content-disposition: filename=image.$file_format");
$img = file_get_contents(urlencode($url));
// as per manual "If you're opening a URI with special characters, such as spaces, you need to encode the URI with urlencode(). "
echo $img;
echo ob_get_clean();
exit();
}
catch(Exception $e)
{
echo $e->getMessage();
}
}
else die('Unknown request');
?>
来自manual
的另一个解决方案有时您可能会在打开http网址时出错。 即使你在php.ini中设置了“allow_url_fopen = On”
对我来说,解决方案是将“user_agent”设置为某种东西。
答案 4 :(得分:0)
开始输出内容时会发送标头。因此,在您上面提供的代码之前的某个地方,内容会被回显(来自PHP或纯HTML或javascript)。你需要找到发生的地方。
答案 5 :(得分:0)