3

我有一个页面,用户可以在其中上传 HTML 文件以用作主题。在向用户显示某些选项之前,HTML 文件对其执行了一些检查。用户填写与 HTML 文件相关的表单,并提交表单。但是,由于脚本结束后临时文件夹中的文件被销毁,我不知道一旦填写并重新提交表单后如何获取 HTML 文件,而不是让用户重新上传文件,这依赖于他们上传相同的文件,并且还使他们上传两次,这是违反直觉的,并且可能是大文件的问题。
这是代码(减少以使其更易于阅读/理解)。表单提交给自己,因此两个“步骤”使用相同的 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

您需要创建自己的临时文件,并在两个脚本之间传递名称。

因此,例如,在您的“第一个脚本”(即文件首次上传时)中,您将:

$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; ?>" />

...这样当您进入“第二个脚本”时(提交调查表后),您可以通过以下方式访问该文件:

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

当然,这取决于人们未能提交第二个表单的可能性,因此您最终会在临时目录中乱扔“孤立文件”,因此您需要实施某种形式的检查,以在文件处于非活动状态后删除文件一定的时间 - 您可以基于文件的最后修改时间。

编辑

这是一个示例,说明如何在/tmp没有 cron 作业的情况下随机运行作业以保持目录整洁:

$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 回答