「webサイト運営」カテゴリーアーカイブ

【PHP】file_get_contentsで取得した画像ファイルを出力すると文字列データとなる

先ほど、file_get_contentsで取得した画像ファイルを出力したところ、画像ではなく画像のデータ(文字化けをともなった文字列)が画面いっぱいに表示されました。
1
2
3
4
<?php
$img = file_get_contents("ここに画像のパスやURL");
echo $img;
?>

あれ?おかしいな・・・と思ったんですが、あれこれ考えていたら原因が分かりました。

file_get_contentsで取得したのはデータ

file_get_contentsで取得したのは画像データですが、所詮データなので、これをそのまま出力したらブラウザ上ではデータ(文字列)として扱われます。

そのためブラウザに「このデータは画像データですよ!」と教えてあげなくてはなりません。

つまり、レスポンスヘッダの「content-type」で「jpeg」「png」「gif」・・・などのMINEタイプを指定する必要があります。

ブラウザはcontent-typeを元にファイルを処理する

通常、サーバーは出力するファイルの拡張子に応じてcontent-typeをヘッダーに含めてブラウザからの要求に応えます。そしてブラウザはそのcontent-typeに応じて画面の出力を工夫します。

しかし環境によっては、サーバーがcontent-typeをレスポンスできない時があります。この場合、当然ブラウザはそのファイルをどのように処理すればよいのかわかりません。

このような時に、画像ファイルにも関わらず、画像として表示されるのではなくデータそのものが表示されてしまいます。

content-typeを指定すればよい

ということで、タイトルのような現象になった場合、content-typeを指定してあげれば解決です。

つまり、このようにします(画像ファイルが「jpeg」の場合)。

1
2
3
4
5
<?php
$img = file_get_contents("ここに画像のパスやURL");
header('Content-type: image/jpeg');
echo $img;
?>

なお、画像ファイルのMIMEタイプが「png」「gif」「bmp」ならば次のようにします。

header(‘Content-type: image/png’);
header(‘Content-type: image/gif’);
header(‘Content-type: image/bmp’);

これでブラウザにしっかりと画像ファイルとして処理させることができます。

蛇足

ブラウザは、拡張子が「.jpg」だから「jpgファイルだ」と決めているわけではありません。content-typeで決めています。

逆を突くと、content-typeを「image/gif」とすると、gifファイルではないものをgifファイルとして処理させることができます。

PHPで、パーミッションが777のディレクトリを作成する方法。

とならない理由

umaskの設定

PHPの mkdir() でディレクトリ(フォルダ)を作成した場合、パーミッションは(サーバの設定によりますが)大体 0755、ファイルの場合は 0644 となると思います。(最初の0は8進数表記によるもの)

これは LINUX など UNIX系のサーバの場合に umask (ユーマスク)という設定がなされているため。
ターミナル等で umask と打つと設定されている値が表示されるのですが、大体「0022」となっていることが多く、

上記のような mkdir() を実行しても 0022 でマスク(引き算)され 0755 となってしまう、というものです。
概念図はこんな感じ。

0777 ←permission値
-0022 ←umask値
—–
0755 ←結果値

0777のディレクトリを作る

ではどうやったら 0777 のディレクトリが出来上がるのか。
元々の umask 値を変えてしまっても良いのですが、それはそれで不都合が出るやも知れないので、もうちょっと穏やかで簡単な方法をとってみたいと思います。

ディレクトリを作ったあとに、chmod() するだけで出来上がってしまいます。
長々と説明した割には、簡単ですね。

PHPでユニーク(一意)なIDを生成する方法

一番楽に作るのはこれ。

$tokenには、 39cb3942d3545a2c7d83b8a853595ad3b3519847 のような文字列が代入されます。

uniqid関数のプレフィックスに当たる部分に mt_rand() を使い、それらをさらにsha1関数で「.(ドット)」を含まない乱数を返すという仕様。

【参照ページ】http://wataame.sumomo.ne.jp/archives/1552