2017-03-23 6 views
0

私はCakePHP 2.4.4でプロジェクトを進めています。そして、私は次の問題に直面しています:私のベンダーアップロードクラスは、新しい画像を作成する一つの関数newImageを呼び出します。たとえば、複数のイメージを5回アップロードすると、この関数は5回連続して呼び出されます。この関数には次のようなコードが含まれています:データベースにレコードを保存するのに十分な時間がありません

...  
...initializing Uploader class 
... 
//creating image 
$this->Orderimage->create(); 
    $data = array(
    'order_id' => $order_id, 
    'filename' => $filename, 
    'date' => date('Y-m-d'), 
    'extension' => $result['ext'], 
); 
$this->Orderimage->save($data); 

しかし、ここで私の問題に会う場所です。 4つ以上の画像をアップロードしようとしているときに、この機能を4回以上連続して呼び出すと、画像がアップロードされず、代わりに前の画像がアップロードされます。これは、これらの画像が同じファイル名になっているためです。しかし、ファイル名は最後に作成された画像+ 1によって与えられます。したがって、データベースが次回の到着時に画像を保存するのに十分な時間がないというバグがあります。そして、これが、別のイメージが別のイメージを上書きする理由です。どうすれば修正できますか?

+3

あなたはファイルアップロードコードを共有していませんでした。 – tarikul05

+0

@ tarikul05を理解するためのコードをもっと共有してください。アップローダの仕事の原則は、この関数を 'newImage'という行を何度も呼び出すことです。それで全部です。 – Vladislav

+0

コードなし、助けなし、私は推測します。 – Mary

答えて

1

+1を使用する代わりに、ファイル名をユニークなものに設定してみてください。例えば

:あなたが誤って同じファイル名を持っていることについて心配する必要はありません

$filename = CakeText::uuid() . '.jpg'; // or try String::uuid() 

その方法。

https://book.cakephp.org/2.0/en/core-utility-libraries/string.html#CakeText::uuid

サイドノート:あなたが1つのディレクトリに多くのファイルをアップロードしている場合、それはネストされたディレクトリにそれらを置くことをお勧めします(3深いが一般的です)。たとえば、のようなもの:あなたはこのようにそれをしなかった場合

$filename = rand(0,99) . DS . rand(0,99) . DS . rand(0,99) . $file; 

は、あなたが同じフォルダ内に同じファイル名+番号の組み合わせを持っています非常に低いだろう。ファイル名だけでなくパスも保存してください。あなたは良いです。これにより、1つのフォルダに非常に多くの画像が保存され、永遠に見ることができます。

注:私は頭の上からこのコードを書きました。私は構文などを確認していませんでしたが、それはあなたにアイデアを与えるべきです。

+0

'String :: uuid();'で解決しました! – Vladislav

0

Davesの解決策は問題を解決するはずですが、ファイル名の規約を守るには、最後に挿入したIDを取得して、ループ内のすべての画像を$lastInsertedId + $counter bevoreで保存してください。その後、穴の画像配列をデータベースに書き出します。

注:このソリューションは、同時書き込み要求がない場合にのみ使用してください。

関連する問題