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ヘッダーを使用すると、クライアントはサーバーに処理できるデータの種類を通知できます。

サーバーはそれを完全に無視するか(リソースが1つの形式でのみ存在する場合は正常です)、それを使用してクライアントに最適な形式を選択する場合があります(適切な形式のデータ)。

あなたは前者の行動を経験しています。URLはPDFファイルを指しています。サーバーはPDFと他の形式のどちらかを決定するように設定されていないため、Acceptヘッダーに注意を払わず、PDFを返します。

コンテンツタイプが特定のものである場合にのみデータを送信するようにサーバーに要求する方法はありますか?

acceptヘッダーは可能な限り近くにあります。

処理できない可能性のある大きなファイルのダウンロードを避けたい場合は、GET要求を行う前に、HEAD要求を行い、応答のContent-Typeを確認してください。

于 2013-01-02T15:04:19.520 に答える
1

ファイルを受信するときは、コンテンツ タイプを確認する必要があります。accept ヘッダーは、要求するコンテンツ タイプではなく、好みのコンテンツ タイプをサーバーに伝えるためのものです。

返されたコンテンツ タイプを確認する方法の例を次に示します。

$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 に答える