2012-07-10 109 views
3

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

您需要创建自己的临时文件,并通过您的两个脚本的名称。

因此,例如,在你的“第一个剧本”(即当文件已首先上传)你会:

$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 DIR整齐无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 session garbage collectors。由于操作简单,这不会以任何有意义的方式对用户体验产生不利影响。

+0

我想过这样的事情,但你已经说清楚了,谢谢你。有没有办法删除这些临时文件没有cron工作(我知道这样做的唯一方法)? – 2012-07-10 11:09:05

+0

上传文件时可以随机运行一个作业(类似于[Drupal poormanscron](http://drupal.org/project/poormanscron)模块)我将使用示例代码进行编辑。 – DaveRandom 2012-07-10 12:12:01

+0

@JosephDuffy请参阅上面的编辑 – DaveRandom 2012-07-10 12:23:57

0

你可以尝试以下方法:

  1. 使用move_uploaded_file()以,并从临时位置的文件移动到服务器上的一个永久位置。一定要给文件移动一个独特的名字,比如'file-'。时间() 。 '.jpg'什么的。

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

  3. 后,一切都结束了,你可以使用删除该文件未设置()

现在该文件被安全地位于服务器上,你还可以选择通过会话访问它。

希望这有助于:)