web-dev-qa-db-ja.com

PHPで画像を出力する

画像があります$file(例../image.jpg

mIMEタイプ$type

ブラウザに出力するにはどうすればよいですか?

66
steven
$file = '../image.jpg';
$type = 'image/jpeg';
header('Content-Type:'.$type);
header('Content-Length: ' . filesize($file));
readfile($file);
129
Emre Yazici

Webサーバーを自分で設定する自由がある場合、 mod_xsendfile (Apacheの場合)などのツールは、PHPでファイルを読み込んで印刷するよりもかなり優れています。 PHPコードは次のようになります。

header("Content-type: $type");
header("X-Sendfile: $file"); # make sure $file is the full path, not relative
exit();

mod_xsendfileはX-Sendfileヘッダーを取得し、ファイルをブラウザ自体に送信します。これは、特に大きなファイルの場合、パフォーマンスに大きな違いをもたらします。提案されたソリューションのほとんどは、ファイル全体をメモリに読み込んでから印刷します。 20kバイトの画像ファイルでは問題ありませんが、200 MバイトのTIFFファイルがある場合は、問題が発生するはずです。

29
$file = '../image.jpg';

if (file_exists($file))
{
    $size = getimagesize($file);

    $fp = fopen($file, 'rb');

    if ($size and $fp)
    {
        // Optional never cache
    //  header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
    //  header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
    //  header('Pragma: no-cache');

        // Optional cache if not changed
    //  header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($file)).' GMT');

        // Optional send not modified
    //  if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) and 
    //      filemtime($file) == strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']))
    //  {
    //      header('HTTP/1.1 304 Not Modified');
    //  }

        header('Content-Type: '.$size['mime']);
        header('Content-Length: '.filesize($file));

        fpassthru($fp);

        exit;
    }
}

http://php.net/manual/en/function.fpassthru.php

22
Mike
header('Content-type: image/jpeg');
readfile($image);
3
code_burgar

これを試して:

<?php
  header("Content-type: image/jpeg");
  readfile("/path/to/image.jpg");
  exit(0);
?>
3
Carlos Lima

この問題にぶつかる次の男やギャルのために、ここで私のために働いたものがあります:

ob_start();
header('Content-Type: '.$mimetype);
ob_end_clean();
$fp = fopen($fullyQualifiedFilepath, 'rb');
fpassthru($fp);
exit;

そのすべてが必要であり、それだけです。 mimetypeが異なる場合は、PHPのmime_content_type($ filepath)をご覧ください

2
Hans

受け入れられた答え ...で展開)

私がする必要がありました:

  1. jpgイメージのログビューandanアニメーションgifand、
  2. 画像がキャッシュされないことを確認してください(したがって、すべてのビューがログに記録されます)、、および
  3. また、retain元のファイル拡張子

"secondary" .htaccess file画像が配置されているサブフォルダー。
ファイルには1行のみが含まれます。

AddHandler application/x-httpd-lsphp .jpg .jpeg .gif

同じフォルダーに、2つの「元の」画像ファイルを配置しました(これらをorig.jpgおよびorig.gif)、および以下の[簡略化された]スクリプトの2つのバリエーション(myimage.jpgおよびmyimage.gif)...

<?php 
  error_reporting(0); //hide errors (displaying one would break the image)

  //get user IP and the pseudo-image's URL
  if(isset($_SERVER['REMOTE_ADDR'])) {$ip =$_SERVER['REMOTE_ADDR'];}else{$ip= '(unknown)';}
  if(isset($_SERVER['REQUEST_URI'])) {$url=$_SERVER['REQUEST_URI'];}else{$url='(unknown)';}

  //log the visit
  require_once('connect.php');            //file with db connection info
  $conn = new mysqli($servername, $username, $password, $dbname);
  if (!$conn->connect_error) {         //if connected then save mySQL record
   $conn->query("INSERT INTO imageclicks (image, ip) VALUES ('$url', '$ip');");
     $conn->close();  //(datetime is auto-added to table with default of 'now')
  } 

  //display the image
  $imgfile='orig.jpg';                             // or 'orig.gif'
  header('Content-Type: image/jpeg');              // or 'image/gif'
  header('Content-Length: '.filesize($imgfile));
  header('Cache-Control: no-cache');
  readfile($imgfile);
?>

画像は正常にレンダリング(またはアニメーション化)され、画像の通常の方法で呼び出すことができます(<img>タグ)、訪問IPの記録を保存しますが、ユーザーには見えません。

0
ashleedawg

finfo (PHP 5.3+)を使用して、適切なMIMEタイプを取得できます。

$filePath = 'YOUR_FILE.XYZ';
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$contentType = finfo_file($finfo, $filePath);
finfo_close($finfo);

header('Content-Type: ' . $contentType);
readfile($filePath);

[〜#〜] ps [〜#〜]Content-Lengthを指定する必要はありません。Apacheが自動的に行います。

0
Fabien Sa
<?php $data=file_get_contents(".../image.jpg" );header("Content-type: image/png"); echo $data; ?>

最初のステップは、特定の場所から画像を取得し、その目的のために変数に保存することです。そのためには、宛先としてパラメーターを指定したfunctio file_get_contents()を使用します。次に、ヘッダーファイルを使用して、出力ページのコンテンツタイプを画像タイプとして設定します。最後に、取得したファイルをエコーを使用して印刷します。

0
Vishnu Pradeep
<?php

header("Content-Type: $type");
readfile($file);

それがショートバージョンです。物事をより良くするためにできることはいくつかありますが、それでもうまくいきます。

0

header を使用して適切なContent-typeを送信できます。

header('Content-Type: ' . $type);

そして readfile は画像の内容を出力します:

readfile($file);


そして多分(おそらく必要ではありませんが、念のため)Content-Lengthヘッダーも送信する必要があります:

header('Content-Length: ' . filesize($file));


注:画像データ(たとえば、空白なし)以外は何も出力しないようにしてください。有効な画像ではなくなりました。

0
Pascal MARTIN
    $file = '../image.jpg';
    $type = 'image/jpeg';
    header('Content-Type:'.$type);
    header('Content-Length: ' . filesize($file));
    $img = file_get_contents($file);
    echo $img;

これは私のために働いています!コードイグナイターでテストしました。 readfileを使用すると、画像は表示されません。 jpgのみを表示することもあれば、大きなファイルのみを表示することもあります。しかし、「file_get_contents」に変更した後、私は風味を得て、動作します!!これはスクリーンショットです: データベースからの「セキュアなイメージ」のスクリーンショット

0