我有一个页面,用户可以上传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">
,但我找不到办法。
答案 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)
您可以尝试以下方法:
使用 move_uploaded_file()并将文件从临时位置移动到服务器上的永久位置。一定要给文件移动一个像'file-'这样的唯一名称。时间() 。 '.jpg'或其他什么。
上传后不久,注册一个Session变量并将文件名放入其中。
现在,文件可以安全地放在您的服务器上,您也可以通过会话访问它。
希望这会有所帮助:)