コンテンツのSHA-1を生成し、それをファイル名として使用するだけでは(git
のオブジェクトがリポジトリのloose object databaseに格納されるようなもの)私は通常、BLOBをRDBMSに挿入するのが好きではありません。それは少しclunkyだし、blobフィールドには、あなたが動作することを期待している種類のファイルサイズのための十分なスペースがあることを確認する必要があります。さらに、ファイルシステムは、ファイルを処理するように最適化されています。したがって、Webサーバーが書き込みアクセス権を持つサーバー上に特別なディレクトリーを保持することは理にかなっています。次に、そこにファイルを書き込み、それらのファイルへの参照をデータベースに格納します。ここでは例です:
// Read the contents of the file and create a SHA-1 hash signature.
$tmpPath = $_FILES['image']['tmp_name'];
$blob = file_get_contents($tmpPath);
$name = sha1($blob) . '.img'; // e.g. b99c6e26c3775fca9918ad614b7be7fe4fd7bee3.img
// Save the file to your server somewhere.
$dstPath = "/path/to/imgdb/$name";
move_uploaded_file($tmpPath,$dstPath);
// TODO: insert reference (i.e. $name) into database somehow...
そして、はい、研究がbroken SHA-1を持っていますが、あなたは十分に妄想している場合は、簡単に(それに対するいくつかのセーフガードを書くことができ例えば、同じハッシュを持つ既存のアップロードをチェックし、それは内容が異なり、それを変更するにはちょっと名前を変更/追加するだけです)。バックエンドの画像は内容によって識別されません。一意の名前が必要です。一度それを持っていれば、実際の画像データに対応するディスク上のファイルパスを見つけるためにDBからファイルを探します。
画像ファイルがかなり大きいと予想される場合は、第4パラメータを使用してメモリに読み込む量をfile_get_contents()
に制限することができます。
*ユニークな結果*はどういう意味ですか?この関数はfileの内容を返すだけなので、ファイルが変更されていなければ決して一意ではありません。 – Soaku
'理由は、それぞれの写真に一意の名前を付けたいからです。' - 'file_get_contents()'はそれを行なわない。 –
ファイルの内容を教えてくれますが、どうすれば写真を保存できますか?一意の名前を持つテーブルの列型のlongblob? varchar(一意の名前を使用)を使用すると、写真を保存して印刷できませんでした。 – cyberspacelogin