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

在PHP脚本之间传递上传的文件,php,html,file-upload,Php,Html,File Upload,我有一个页面,用户可以上传一个HTML文件作为主题使用。在向用户显示某些选项之前,HTML文件会对其执行一些检查。用户填写与HTML文件相关的表单,并提交表单。但是,由于临时文件夹中的文件在脚本结束后被销毁,我不知道在填写表单并重新提交后如何获取HTML文件,而不是让用户重新上传文件,这依赖于他们上传相同的文件,也让他们上传两次,这是违反直觉的,可能是大文件的问题。 下面是代码(简化以使其更易于阅读/理解)。表单提交给自身,因此两个“步骤”使用相同的PHP文件 if($\u服务器['REQUES

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

if($\u服务器['REQUEST\u METHOD']=='POST'){
//表格已经提交
$files=$_文件['file'];
/*关于上传的HTML文件的选项使用PHP生成并显示在此处*/
}否则{
?>
主题文件

您可以尝试以下方法:

  • 使用移动上传的文件()并将文件从临时位置移动到服务器上的永久位置。请确保为文件指定一个唯一的名称,如“file-”.time()..jpg”或其他名称

  • 上传后不久,注册一个会话变量并将文件名放入其中

  • 一切结束后,可以使用unset()删除该文件
  • 现在,该文件已安全地位于服务器上,您也可以通过会话访问它


    希望这有帮助:)

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

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

    $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; ?>" />
    
    当然,这取决于人们无法提交第二份表格的可能性,因此你最终会得到“孤立文件”乱扔临时目录,因此您需要执行某种形式的检查,在文件处于非活动状态一段时间后删除文件-您可以根据文件的上次修改时间进行此检查

    编辑

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

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

    我考虑过类似的事情,但您已经向我说得很清楚了,谢谢。有没有办法在不使用cron作业的情况下删除这些临时文件(这是我知道的唯一方法)?上传文件时,你可以随机运行作业(类似于模块),我将使用示例代码进行编辑。我还需要再处理一些,但总体上看起来不错。但是,当我使用
    $tempFolderName=sys_get_temp_dir()./')。uniqid('upload_u',TRUE)“/”;
    $tempFolderName
    的值为
    C:\Windows\TEMP/upload\u 4ffc43722041.76382376/
    ,它有两个问题。1)这是Windows临时文件夹,而不是php文件夹,这可能会导致问题(?)2)我如何知道使用“/”或“\”?我假设这是基于操作系统的,但我希望它能在OSs上运行。(注意:我想用一个随机名称将所有文件放在PHP临时目录(不在公共视图中)的一个文件夹中)另请注意:我可能对数字1完全错误,这可能是预期的结果;我只是认为它会存储在PHP
    tmp
    文件夹中。@JosephDuffy在Windows上运行PHP时,PHP tempdir==Windows tempdir-只要web服务器用户有权限写入它,这不会导致问题(很可能会这样)。你可以在Windows上使用
    /
    ,它会工作,所以我总是在每个脚本中使用
    /
    ,以实现交叉兼容性。但是,如果你担心这个问题,你可以使用常量来获取系统的默认字符。
    $tmpFile = "/tmp/".basename($_REQUEST['uniqName']).".html";
    
    $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);
        }
      }
    }