我正在尝试使用此功能从PHP下载Facebook的用户个人资料图片
public static function downloadFile($url, $options = array())
{
if (!is_array($options))
$options = array();
$options = array_merge(array(
'connectionTimeout' => 5, // seconds
'timeout' => 10, // seconds
'sslVerifyPeer' => false,
'followLocation' => true, // if true, limit recursive redirection by
'maxRedirs' => 2, // setting value for "maxRedirs"
), $options);
// create a temporary file (we are assuming that we can write to the system's temporary directory)
$tempFileName = tempnam(sys_get_temp_dir(), '');
$fh = fopen($tempFileName, 'w');
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_FILE, $fh);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $options['connectionTimeout']);
curl_setopt($curl, CURLOPT_TIMEOUT, $options['timeout']);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, $options['sslVerifyPeer']);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, $options['followLocation']);
curl_setopt($curl, CURLOPT_MAXREDIRS, $options['maxRedirs']);
curl_exec($curl);
curl_close($curl);
fclose($fh);
return $tempFileName;
}
问题是它使用随机名称和没有扩展名将文件保存在/ tmp目录中。如何获取文件的原始名称(我对原始扩展名更感兴趣)
这里重要的事情是:
答案 0 :(得分:2)
如果网址重定向到图片,您仍然可以从标头中获取文件名。使用具有Chrome等开发工具的浏览器,您可以查看从原始请求到结果文件的来回标题,文件名必须在某处。话虽如此,我的印象是Facebook出于隐私原因将所有图像重写为自己的文件名。
您可以根据回复的内容类型重新创建扩展程序。
运行curl_exec()后,尝试:
$content_type = curl_getinfo($curl,CURLINFO_CONTENT_TYPE);
例如,这将为JPEG返回类似“image / jpg”的内容。然后,您可以重命名临时文件以具有适当的扩展名。
如果你可以使用PHP 5.3,一个可能更简洁的方法就是在下载后调用文件上的finfo_file(),它应该读取MIME类型,允许你选择一个合适的扩展而不依赖于标题数据。 finfo_file()也可以在fileinfo PECL扩展中使用。
答案 1 :(得分:2)
如果您只是寻找图像类型(jpg / png / gif)并且安装了GD扩展程序,则可以使用getimagesize,它会返回图像类型以及其他详细信息。它比查看文件扩展名更准确。
使用getimagesize
后,image_type_to_mime_type也可能会有所帮助。