在PHP脚本之间传递上传的文件

时间:2012-07-10 10:40:12

标签: php html file-upload

我有一个页面,用户可以上传HTML文件作为主题。在向用户显示某些选项之前,HTML文件会对其执行一些检查。用户填写与HTML文件相关的表单,并提交表单。但是,由于temp文件夹中的文件在脚本结束后被销毁,我不知道如何在填写表单后重新提交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">,但我找不到办法。

2 个答案:

答案 0 :(得分:2)

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

例如,在你的&#34;第一个脚本&#34; (即首次上传文件时)你会:

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

...这样当你到达第二个脚本时#34; (在提交问卷表格后),您可以通过以下方式访问该文件:

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

当然,这可能会导致人们无法提交第二种形式,因此您最终会收到“孤立的文件”。乱丢你的临时目录,所以你需要实现某种形式的检查,在它们处于非活动状态一定时间之后删除文件 - 你可以根据文件的最后修改时间来确定它。

修改

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

$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 session garbage collectors的运作方式类似。由于操作简单,这不应以任何有意义的方式对用户体验产生负面影响。

答案 1 :(得分:0)

您可以尝试以下方法:

  1. 使用 move_uploaded_file()并将文件从临时位置移动到服务器上的永久位置。一定要给文件移动一个像'file-'这样的唯一名称。时间() 。 '.jpg'或其他什么。

  2. 上传后不久,注册一个Session变量并将文件名放入其中。

  3. 一切都结束后,你可以使用unset()
  4. 删除文件

    现在,文件可以安全地放在您的服务器上,您也可以通过会话访问它。

    希望这会有所帮助:)