3

ユーザーがテーマとして使用する HTML ファイルをアップロードできるページがあります。HTML ファイルでは、一部のオプションがユーザーに表示される前に、いくつかのチェックが実行されます。ユーザーは、HTML ファイルに関連してフォームに入力し、フォームを送信します。ただし、スクリプトの終了後に一時フォルダー内のファイルが破棄されるため、フォームに入力して再送信した後、ユーザーにファイルを再アップロードさせる以外に、HTML ファイルを取得する方法がわかりません。これは、同じファイルをアップロードすることに依存しており、何かを 2 回アップロードすることにもなります。これは直感に反し、大きなファイルでは問題になる可能性があります。
コードは次のとおりです (読みやすく、理解しやすいように省略してあります)。フォームはそれ自体に送信されるため、同じ PHP ファイルが両方の「ステップ」に使用されます。

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    // Form has been submitted
    $files = $_FILES['file'];
    <form method="POST">
        /* Options about the uploaded HTML file are generated using PHP and displayed here */
        <input type="submit">
    </form>
} else {
    ?>
    <form method="POST" enctype="multipart/form-data">
        <label for="file">Theme File(s)</label>
        <input type="file" name="file[]" multiple="multiple">
        <input type="submit">
    </form>
    <?php
}

を使用してみ<input type="file" name="file[]" multiple="multiple" value="<?php echo $files; ?> >ましたが、これは機能せず、ユーザーがファイルを再アップロードする必要があり、ファイルが大きくなりすぎると問題になる可能性がありました。
ファイルを内部的に渡す方法があり、ファイルがアップロードされたかどうか、またはスクリプトに渡されたかどうかを確認する方法があるのではないかと考えていましたが<input type="file" name="file[]" multiple="multiple">、それを行う方法が見つかりませんでした。

4

2 に答える 2

2

独自の一時ファイルを作成し、2つのスクリプト間で名前を渡す必要があります。

したがって、たとえば、「最初のスクリプト」(つまり、ファイルが最初にアップロードされたとき)では、次のようになります。

$uniqName = uniqid('upload_', TRUE);
$tmpFile = "/tmp/$uniqName.html";
move_uploaded_file($_FILES['file']['tmp_name'][0], $tmpFile);

そして、このアップロードの結果からフォームを生成するときに、追加します

<input type="hidden" name="uniqName" value="<?php echo $uniqName; ?>" />

...「2番目のスクリプト」に到達したとき(アンケートフォームが送信された後)、次の方法でファイルにアクセスできます。

$tmpFile = "/tmp/".basename($_REQUEST['uniqName']).".html";

もちろん、これは人々が2番目のフォームに送信できない可能性があるため、一時ディレクトリに「孤立したファイル」が散らばってしまう可能性があるため、非アクティブになった後にファイルを削除する何らかの形式のチェックを実装する必要があります。一定の時間-これは、ファイルの最後に変更された時間に基づくことができます。

編集

/tmpcronジョブなしでディレクトリを整頓するためにジョブをランダムに実行する方法の例を次に示します。

$probabilityDivisor = 10; // 1/10 chance of running
$uploadTTLSecs = 1800; // 30 minutes

if (mt_rand(1, $probabilityDivisor) / $probabilityDivisor == 1) {
  foreach (glob('/tmp/upload_*') as $file) {
    // Iterate files matching the uniqids you generate
    if (time() - filemtime($file) >= $uploadTTLSecs) {
      // If file is older than $uploadTTLSecs, delete it
      unlink($file);
    }
  }
}

これは、PHPセッションのガベージコレクターと同じように動作します。操作が簡単なため、これがユーザーエクスペリエンスに意味のある形で悪影響を与えることはありません。

于 2012-07-10T10:49:36.433 に答える
0

次のことを試すことができます。

  1. move_uploaded_file()を使用して、ファイルを一時的な場所からサーバー上の永続的な場所に移動します。移動するファイルには、必ず「file-」のような一意の名前を付けてください。時間() 。'.jpg'か何か。

  2. アップロード後すぐに、Session変数を登録し、ファイル名をその中に入れます。

  3. すべてが終わったら、unset()を使用してファイルを削除できます

これで、ファイルはサーバー上に安全に配置され、セッションを介してファイルにアクセスすることもできます。

お役に立てれば :)

于 2012-07-10T10:47:53.360 に答える