2

アイデアはこれです:

  1. ユーザーは、現在のセッションでのみ存在する「一時」フォルダーにファイルをアップロードします。
  2. ユーザー登録
  3. 「一時」フォルダーからのファイルは、ストレージとも呼ばれる永続フォルダーに移動されます。

私はこのようなことができます:

mkdir('tempfiles/'.session_id(), 777)

ファイルをアップロードします。

if (move_uploaded_file($_FILES['my_files']['tmp_name'], 'tempfiles/'.session_id().'/')) {
  // echo "success";
}

ユーザー登録すると、ファイルは別のフォルダーに移動され一時フォルダーは次のように削除されます。

/* some function to empty dir */
rmdir('tempfiles/'.session_id())

問題は: アップロード後にユーザーが登録されない場合は? 一時フォルダを削除するには?

関数を使用tempnamすると、「自分で削除する」フォルダーを作成できます..しかし、Windowsサーバーでは、たとえば作成できませんtempnam('/tmp/test', '');.3文字のプレフィックスを設定するだけです:C:\Windows\Temp\pre569E.tmp

私の唯一のアイデアは、一時フォルダーのデータベース パスに書き込むことです。

どんな助けでも大歓迎です。

4

1 に答える 1

2

ユーザーが登録されていない場合は、手動でアクセスしてそれらのファイルをクリーンアップする必要があります。元の一時ファイルをそのままにしておいた場合にのみ、PHP はアップロードを自動クリーニングします。アップロード一時ディレクトリから明示的に移動したため、クリーンアップは完全にあなた次第です。

空でないディレクトリを rmdir することはできません。最初に、そのディレクトリ内のすべてのファイルを削除する必要があります。最も簡単な方法は、

$files = glob('tempfiles/' . session_id());
foreach($files as $file) {
   unlink($file);
}

ユーザーごとにサブディレクトリを作成しない方が簡単です。ファイルをアップロード一時ディレクトリから移動し (PHP が自動クリーニングしないようにするため)、ファイル名として session_id() を使用して別の単一の中間ディレクトリに保存します。これにより、未登録の各ユーザーが一時的に保持される単一のファイルに制限されますが、これはおそらく良いことです。すべてのユーザーのファイルが混在しますが、それぞれに一意のセッション ベースの名前があるため、競合は発生しません。

登録しないことを選択したユーザーから孤立したファイルをクリーンアップする必要がありますが、これらの一時ファイルのすべてについて、一致するセッション ファイルがないかどうかを確認するのは簡単なことです。セッション ファイルがない場合は、その後、ユーザーはセッションを放棄し、PHP は古いセッション ファイルを削除しました。そのため、時間指定されたジョブでこのクロスチェックを実行し、一致するセッションがないファイルを削除できます。

于 2011-10-28T20:37:50.700 に答える