47
44

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPで同じ画像に一意の同じファイル名を付ける

Last updated at Posted at 2015-05-28

元々はとあるページで、ユーザーが画像をアップロードし、そのページ上でユーザーが自身でアップロードした画像を利用するという要件でプログラムを書いていた時に、

「ユーザーが付けたファイル名をそのまま上げるのは嫌だけど、毎回timestampで個別のファイル名を付けていたらファイル数膨大になるしなー」

って思ったのがきっかけ。

なら画像のバイナリのハッシュ値をファイル名にすれば、同じ画像ファイルなら同じファイル名を生成できるじゃん、と。

$img_dir = "/var/www/foo/images/"; // 画像を格納するディレクトリ

// tmpファイルのパスを取得
$tmppath = $_FILES["upload"]["tmp_name"];

// ファイルの拡張子を取得
$path_parts = pathinfo($_FILES["upload"]["name"]);
$extension = $path_parts['extension'];

// 画像のデータをSHA-1でハッシュ化してファイル名を作る
$imgfilehash = hash_file("sha1", $tmppath);

// 画像格納先のフルパスを生成
$imgfilepath = $img_dir.$imgfilehash.".".$extension;

// tmpから画像を格納
move_uploaded_file($tmppath, $imgfilepath);

もちろんMD5で変換する以上、偶然違う画像でも同じハッシュ値が出る可能性は0じゃないけど、無視できる確率ではないかと。(15/05/30 コメントでの指摘を元に一部コード修正。またMD5だと衝突する可能性があるそうなので、より安全なSHA-1を採用しました。)

PHPで書いたけど、他の言語でも同じ手法で使えそう。

47
44
18

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
47
44

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?