[PHP-users 15325]POSTとGETの違いについて

柴田俊秀 shibata.toshihide @ nttcom-hokkaido.co.jp
2003年 5月 16日 (金) 14:12:59 JST


北海道の柴田です。

過去のメールを[ POST GET header ]で検索しましたが
確認できませんでした。

POSTまたはGETで取得した画像ファイル名で、データを取得し、
画面にheader()を使用しで表示させた場合について教えて
ください。

下記のソースでPOST/GETで違いがでてきますが理由がわかり
ません。
POSTで処理するときに、header()の前に画面に何か出力され
るのでしょうか

OS:windows2000
Apache2.0.44
php4.2.3
                                  ○ 画面に表示される
                                  × 画面に表示されない
ブラウザ        POST        GET
-----------------------------------
Netscape4.78     ○          ○
IE6.0.2800.1106  ○          ○
わじら1.1        × 注1      ○
Opera7.03        × 注2      ○

※注1 : 一瞬画面に表示されその後以下のメッセージが画面に
        表示される
        ---------------------------------------------------
        この画像"http://xxxxx途中略xxx/downfile.php"は
        表示できませんでした。画像ファイルにエラーがあります。
        ---------------------------------------------------
  注2 : imageの枠のみ表示される

なお、デバック時に保存される画像ファイルは元のファイルと
サイズも一致しており、表示も正常です。

※ デバック時の出力 : define ("DEBUGS", true);
(1) GETの場合
$_GET=Array ( [fname] => http://xx.xxx.xxx.xx/images/wall.gif ) =
$_POST=Array ( ) =
$fname=http://xx.xxx.xxx.xx/images/wall.gif=
$name=wall.gif=
$application=image/gif=
./wall.gif.back::$len=14104

(2) POSTの場合
$_GET=Array ( ) =
$_POST=Array ( [fname] => http://xx.xxx.xxx.xx/images/wall.gif ) =
$fname=http://xx.xxx.xxx.xx/images/wall.gif=
$name=wall.gif=
$application=image/gif=
./wall.gif.back::$len=14104

                記

<?php
define ("DEBUGS", false);
define ("READMAX", 10000000);  //filesize=10Mbyteまで
$fname=isset($_POST['fname']) ? $_POST['fname'] : '';
if($fname==""){
    $fname=isset($_GET['fname']) ? $_GET['fname'] : '';
}
if($fname==""){
     exit;
}else{
   if(DEBUGS){
     print("\$_GET=");print_r($_GET);print("=<br>\n");
     print("\$_POST=");print_r($_POST);print("=<br>\n");
   }
    //拡張子で型を判断
    $path_parts = pathinfo($fname);
    switch ($path_parts["extension"]){
        case "pdf" :
            $application ="application/pdf";
            break;
        case "gif" :
            $application ="image/gif";
            break;
        case "jpeg" :
            $application ="image/jpeg";
            break;
        case "jpg" :
            $application ="image/jpeg";
            break;
        case "txt" :
            $application ="text/plain";
            break;
        default :
            $application ="application/octet-stream";
            break;
    }
    //ファイル名取得
    $name = basename($fname);
    if(DEBUGS){
        print("\$fname=$fname=<br>\n");
        print("\$name=$name=<br>\n");
        print("\$application=$application=<br>\n");
        print("<img src='$fname' /> ");
    }
    //ファイルリード
    $fd = fopen ($fname, "rb");
    $contents = fread ($fd,READMAX );
    fclose ($fd);
  //ファイルサイズ確認のため
    $path ="./".$name .".back";
    $fp = fopen( $path, 'w' );
    fwrite($fp,$contents);
    fclose($fp);
    //画面出力
    $len = filesize ($path);
    if(DEBUGS){
        print("$path::\$len=$len<br>\n");
    }else{
        header("Content-type: $application");
        header("Content-Length: $len");
//        header("Content-Disposition: inline; filename=$name");
        header("Content-Disposition: attachment; filename=$name");
        print $contents;
        unlink($path);  //tempファイル削除
    }
}
?>
以上



PHP-users メーリングリストの案内