3

这是我的代码;

<?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 文件的 url。我希望它会给出某种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 标头的工作原理是错误的,还是我做错了什么?有没有办法让服务器只在内容类型特殊时才发送数据?

4

2 回答 2

3

Accept 标头让客户端告诉服务器它可以处理哪些类型的数据。

服务器可能会完全忽略它(如果资源仅以一种格式存在,这是正常的)或者它可能会使用它来选择最适合客户端的格式(如果它没有 406 Not Acceptable 错误,它可能会响应适当格式的数据)。

您正在经历前一种行为。URL 指向一个 PDF 文件。服务器未设置为在 PDF 和其他格式之间做出决定,因此它不注意 Accept 标头并返回 PDF。

有没有办法让服务器只在内容类型特殊时才发送数据?

接受标头尽可能接近。

如果您想避免下载可能无法处理的大文件,请在发出 GET 请求之前发出 HEAD 请求并检查响应的 Content-Type。

于 2013-01-02T15:04:19.520 回答
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");
    }
  }
}
于 2013-01-02T14:53:18.800 回答