这是我的代码;
<?php $url = @$_POST["ekleme"];
if (filter_var($url,FILTER_VALIDATE_URL) === FALSE) {
die("Geçersiz link!");
}
$cparams = array('http'=>array('method'=>"GET",'Accept'=>'image/jpg,image/gif,image/png'));
$context = stream_context_create($cparams);
$fp = @fopen($url, 'rb', false, $context);
if (!$fp) die("Problem with url");
$meta = stream_get_meta_data($fp);
var_dump($meta);
我正在给它一个pdf文件的网址。我希望它能给出一些http错误。但这就是我得到的;
array(10) {
["wrapper_data"]=>
array(9) {
[0]=>
string(15) "HTTP/1.1 200 OK"
[1]=>
string(35) "Date: Wed, 02 Jan 2013 14:16:02 GMT"
[2]=>
string(14) "Server: Apache"
[3]=>
string(44) "Last-Modified: Wed, 19 Dec 2012 13:53:09 GMT"
[4]=>
string(34) "ETag: "1c80e53-f5a7-4d134ef3b7b40""
[5]=>
string(20) "Accept-Ranges: bytes"
[6]=>
string(21) "Content-Length: 62887"
[7]=>
string(29) "Content-Type: application/pdf"
[8]=>
string(17) "Connection: close"
}
它继续显示其他无关的事情。我是否知道Accept header的工作原理是错误的,还是我做错了什么?有没有办法让服务器只发送数据,如果内容类型是特定的东西?
答案 0 :(得分:3)
Accept标头允许客户端告诉服务器它可以处理哪些类型的数据。
服务器可能会完全忽略它(如果资源仅以一种格式存在,这是正常的),或者它可以使用它来选择最适合客户端的格式(如果它没有,它可能会响应406 Not Acceptable错误) t以合适的格式提供数据。)
您正在体验前一种行为。 URL指向PDF文件。服务器未设置为在PDF和其他格式之间做出决定,因此它不会关注Accept标头并返回PDF。
有没有办法让服务器只在内容类型特定的情况下发送数据?
接受标题尽可能接近。
如果您想避免下载可能无法处理的大型文件,请在发出GET请求之前发出HEAD请求并检查响应的Content-Type。
答案 1 :(得分:1)
收到文件时,您负责检查内容类型。接受标题仅用于告诉服务器您首选的内容类型,而不是您要求的。
以下是有关如何检查返回的内容类型的示例。
$meta = stream_get_meta_data($fp);
$allowed = array("image/jpg", "image/gif", "image/png");
foreach($meta['wrapper_data'] as $header) {
if(preg_match('/content-type: (.*)/i', $header, $matches)) {
if(!in_array(strtolower($matches[1], $allowed)) {
die("Invalid content type");
}
}
}