2011-03-29 10 views
1

私は2つのフラッシュ/エアアプリケーションのための本当のシンプルな "バックエンド"(PHP5)を作っています。そのうちの1人は写真をアップロードし、バックエンドはそれをフォルダに保存し、2番目のアプリは新しい写真をバックエンドにポーリングして表示します。完成したファイルのみを取り込みます

私はデータベースにアクセスできないため、バックエンドは純粋なPHP5でなければなりません。そのため、イメージをフォルダに保存し(名前にタイムスタンプを付けて)、readdir()を使用してイメージを取り戻すことにしました。

これはすべて魅力のように機能します。それにもかかわらず、私は本当にバックエンドが写真が完全にアップロードされただけを返すようにして、2番目のアプリが未完成の画像をロードしようとしないようにしたいと思います。ファイルを検証するために使用できるメソッド/トリックはありますか?

+0

ファイルが完全に書き込まれるようにする方法の1つは、アップロードプロセスがその習慣に従うと、 'flock(..、LOCK_EX | LOCK_NB)'でそれをポーリングすることです。 – mario

答えて

0

あなたは離れてファイルサイズ数百ミリ秒をチェックし、それが変わるかどうかを確認できます。

$first = filesize($file); 
// wait 100ms 
usleep(100000); 
$second = filesize($file); 

if($first == $second) { 
    // file is no longer being actively uploaded 
} 
0

本当に簡単で一般的な方法をそうするように、ファイル名に基づいてトリガファイルを作成することですあなたはあなたがそのファイルを作成

123.jpg 
123.rdy 

または

123.jpg 
123.jpg.rdy 

のような何かを得ることアップロードが完了するとすぐに(ただ空のスタブ)。ロードするファイルを取得するアプリケーションは、トリガーファイルを使用してファイルを扱い、それを処理します。または、アップロードしたファイルをieとして保存することもできます。 123.bsyまたは123.jpg.bsyがアップロードされている間に、アップロードが完了した後にフィニール名123.jpgに名前を変更します。同じディレクトリ内の名前の変更は通常処理時間の点では非常に安価な操作なので、競合状態での実行の可能性はかなり低いはずです。ただし、使用するOSによって異なる場合があります。

ファイルをその場所に保存する必要がある場合は、もちろん、各ファイルのレコードを追加するデータベースを使用することもできますが、アップロードが完了すると、他のアプリは、一致するデータベースレコードをファイルに提供するだけです。

0

原子ファイルシステムの通常の操作は、リーダー(たとえばXXX.jpg.tmp)と一致しない一時ファイルに書き込むことです。完全にアップロードされたら、それをターゲット名に変更します。同じボリューム上の名前の変更はアトミックであるため、ファイルが未完成であるか使用不可能であることはありません。

0

これをすべて書き留めた後、私は自分自身をそれを驚かせました。私がやったのは、ファイル名に正確なバイト数を加えて、画像のリストを出力する際に​​それを検証することでした。 .tmp/.bsy-sollutionも素晴らしいですが、私は少し遅くそれを読む:) 私の解決策の上にアップロードが完了した後に名前の変更が必要ないということです。皆さん、ありがとうございました。

関連する問題