Menu

画像の保存場所を隠す

2015年10月4日00:45  投稿者 : PINION

gamen

今回は、画像の保存場所を知られたくない場合の表示方法。
といっても、表示される訳だから当然画像として保存は出来ますが、例えば画像データが存在するディレクトリ階層を知られたくないなど、HTMLで直接ファイルを指定せずに表示できないか?と思う事があります。

PHPで直接出力する

実は、当サイトのFree Photoのコーナーでは、PHPでファイルを読み込み、それを出力する形で表示させており、画像のURLはPHPのURL+画像番号という形になっています。(サムネイル用と大きい画像用と二つのPHPを用意してあります。)

当サイトで使用しているのと少し違いますが、まずはPHPソースから。

<?php
$file = $_GET['f'] . '.' . $_GET['t'];
$path = "/home/******/www/*****/images/";

header('Content-Disposition: inline; filename="' . $file . '"');

switch($_GET['t']){
	case "gif" :
		header('Content-type: image/gif');
		break;
	case "png" :
		header('Content-type: image/png');
		break;
	default :
		header('Content-type: image/jpeg');
		break;
}

readfile($path . $file);
?>

これで、このPHPのURLに f=[ファイル名]、t=[画像タイプ]のパラメータを与えてやれば、指定した画像が出力されます。
このPHPのURLが
http://www.mp-create.com/image.php
だとしたら、パラメータを加えて
http://www.mp-create.com/image.php?f=filename&t=jpg
となります。
今回の場合、URLを短くするために拡張子は画像タイプから追加するようにし、パラメータからは省略しています。

$path は画像が保存されているディレクトリまでのパスです。
詳しくは、ファイルをダウンロードさせるの記事をご覧ください。

header関数のContent-Dispositionで、inline(ページ内表示)、ファイル名を示しています。

switchの中身は、画像タイプからheader関数のContent-typeでファイルの種類を示しています。

最後に、readfileで指定のファイルを出力しています。
ヘッダー情報を示してからファイルを出力という内容は、前回のファイルをダウンロードさせる方法と近いですね。

エンコードして文字列としてHTMLに埋め込む

さて、画像ファイルを直接出力する方法の他に、画像を文字列に変換してHTMLに直接埋め込んでしまう方法があります。
まずはソースから。

<?php
function image64($file , $type , $path){
	$img = base64_encode(file_get_contents( $path . $file ));
	echo '<img src="data:;base64,'.$img.'">';
}

$path = "/home/******/www/*****/images/";
image64('filename.jpg' , 'jpeg' . $path);

?>

まず、使いまわしが出来るようにfunctionでユーザー定義関数を用意します。
file_get_contentsでファイルを指定し、それをBASE64エンコードで文字列化します。
最後に、HTMLのimgタグを出力し、srcに画像タイプと、BASE64形式である事を記述して、文字列化した画像データを出力しています。
このユーザー定義関数に対して、ファイル名、画像タイプ、ファイルのパスを渡して表示させています。
この場合は汎用性を持たせるために、ファイルのパスは関数外から指定していますが、画像の場所が固定ならば関数内に入れてしまっても良いですね。
また、先のPHPで直接出力しているのと違って画像タイプを指定していても、ファイルの拡張子は省略できるようになっていません。(URLを出力する訳ではないので長くても問題ない事、PHPのソースを簡略化したほうが見やすい事から)

この方法は、色々応用が出来ます。
今回の場合は画像を表示する時にBASE64エンコードで文字列化していますが、先に文字列化してデータベース等に文字データとして登録しておき、それを読みだしてそのまま表示するという方法もありでしょう。

ただし、注意点が2つ。
まず、同じ画像を複数のページで表示する場合、画像のURLを直接指定している場合はブラウザーは同じ画像はキャッシュから読んでくれますが、この方法だと同じ画像でもHTML内のデータを読みますので、そのぶん遅くなります。
逆に言うと、画像を頻繁に(同じファイル名で)更新している場合などは、キャッシュを読んでしまって本来の画像が表示されないという事を防ぐ事も可能という事ですね。
まあ、それはHTMLのmetaタグで防げば済む事ですけども。

また、画像が大きくなれば大きくなるほど、当然この文字列も長くなりますので、HTMLがすごく長くなります。
一度やってみるとわかりますが、この方法で大きな画像を表示させると、本当に気持ち悪いくらい長くなります。

PHPで出力する方法、BASE64で出力する方法、どちらも用途はそれほど多くないですが、中でやっている処理は知っておくべき内容だと思います。

コメントを残す

メールアドレスが公開されることはありません。

コメントフィード

トラックバックURL : https://www.mp-create.com/88.html/trackback

PHP & MySQLトップ