Php 如何在用户离开页面时删除文件?

Php 如何在用户离开页面时删除文件?,php,javascript,html,Php,Javascript,Html,我有一个将动作设置为php文件(verify.php)的表单。 在表单中,我做了一个很好的图片上传部分。 提交表单后,将打开verify.php以验证用户填写的表单 表单值都放在verify.php页面上的另一个表单中。 只有图像被上传到服务器上的文件夹,这是我的问题。 我希望图像被删除,如果用户后悔(没有验证)放入广告,或者如果用户再次回去更改广告 我该怎么做 一种方法是在页面“卸载”时删除文件名(用户点击后退按钮)。但是,如果用户关闭verify.php页面上的浏览器,这并不能解决问题,因为

我有一个将动作设置为php文件(verify.php)的表单。 在表单中,我做了一个很好的图片上传部分。 提交表单后,将打开verify.php以验证用户填写的表单

表单值都放在verify.php页面上的另一个表单中。 只有图像被上传到服务器上的文件夹,这是我的问题。 我希望图像被删除,如果用户后悔(没有验证)放入广告,或者如果用户再次回去更改广告

我该怎么做

一种方法是在页面“卸载”时删除文件名(用户点击后退按钮)。但是,如果用户关闭verify.php页面上的浏览器,这并不能解决问题,因为这不算“卸载”,对吗

解决方案

如果你需要更多的输入,告诉我,我会更新这个帖子


谢谢

我会对用户确认其广告发布的时间设置一个时间限制。然后,在预定时间启动监控任务,如果广告未确认,则从服务器上删除图像。

我认为很难检测到用户何时真正离开页面。我看到的大多数解决方案通常在会话超时时执行一些操作(例如删除临时文件)。

为每个文件设置一个带有时间戳的数据库条目。然后,当流程完成时,删除该条目。然后,每天检查一次表,删除仍然存在的所有文件,并从表中删除这些记录。。。这是最安全的赌注。

检测浏览器关闭之类的“放弃”基本上是不可能的。没有可靠的方法在服务器端实时跟踪它。删除这些图像的最简单方法是设置一个正在运行的进程,以删除与放弃的单曲相关的图像。

通常情况下,服务器端脚本不知道用户离开页面或关闭浏览器,它只能检查会话超时,但通常为30分钟或更长时间取决于设置

所以,如果您真的喜欢实时执行,请在页面中放置ajax计时器,并每隔30秒或类似的时间向服务器发送hello请求,然后如果超过1分钟或类似的时间没有响应,您可以删除图像文件


但是,如果服务器上有很多用户,每30秒或更短时间向服务器发送一次ajax请求可能会影响服务器性能。

不幸的是,这是一件非常棘手的事情,更简单的解决方案是检查哪些文件是旧的,并在下次有人访问页面时将其删除。这完全可以通过PHP完成,而且非常可靠。

在验证提交的数据后,您是否可以简单地上传图像?

在用户明确验证之前,不要将文件移动到其永久位置。PHP将上传的文件放在一个特定的位置,通常是/tmp目录(在*nix安装中),当需要空间时,该目录会按fifo顺序自动清除。因此,如果您不将文件移出这个特殊目录,那么它将在将来的某个未指定的时间自动清理,而无需您进一步干预。

我将按历元时间(使用time()函数)命名图像,如1258560055.jpg,然后构建一个cron作业,该作业将进入并删除每一个一小时的图像,两个小时或以后

也许我误解了,但过程可能是这样的:

1个用户上载文件(正常情况下会转到*nix/tmp文件夹)

2您将文件移动到第二个临时文件夹/上载\u未确认

3当用户实际确认操作时,您 a) 将其移动到您的文件夹以永久保留,例如,/clientfolder/theirusername.jpg b) 然后删除/upload\u unconfirm中的theirusername.jpg

在后台,在/upload\u unconfirm中运行一个早于1小时的cron到rm everyfile/*

如果每个客户端只有一个映像,则后续上载将覆盖它们的旧文件。

这是如何做到的:

jQuery:

$(window).bind('beforeunload',function(){
    if(check){ //whatever check you wish to do
        return 'Are you sure you want to leave?';
    }
});
$(window).unload(function(){
    $.ajax({
        type: 'POST',
        url: 'file.php',
        data: 'value=unload',
        async: false // this will not work if set to 'true'
    });
    alert('done');
});
if(isset($_POST['value'])){

    if($_POST['value']=='unload'){

        foreach(glob($targetFolder.'*.*') as $file){
            unlink($file); // remove every file
        }
        rmdir($targetFolder); // remove directory
    }
}
PHP:

$(window).bind('beforeunload',function(){
    if(check){ //whatever check you wish to do
        return 'Are you sure you want to leave?';
    }
});
$(window).unload(function(){
    $.ajax({
        type: 'POST',
        url: 'file.php',
        data: 'value=unload',
        async: false // this will not work if set to 'true'
    });
    alert('done');
});
if(isset($_POST['value'])){

    if($_POST['value']=='unload'){

        foreach(glob($targetFolder.'*.*') as $file){
            unlink($file); // remove every file
        }
        rmdir($targetFolder); // remove directory
    }
}

注意:我还有一个
cron
作业每周运行一次,以防万一。
php
情况是,用户获得一个特定的tmp文件夹并上传文件(即简历、激励信…),如果他未提交就离开,文件和文件夹将被删除。

为什么这个过程有两个步骤?我发现这很难理解,但你似乎有一个表单,用户填写,它上传他们的信息+图像,然后有另一个页面来验证广告?但如果用户返回并选择另一个图像,会不会中止第一个时间限制的过程或什么。。。HMMMI如果用户可以选择上传不同的文件,那么上传过程似乎会检查当前进程(用户会话、令牌等)在服务器上是否已经有关联的文件。如果是,请删除该文件,然后将新文件保存到服务器。你是说手动?也许是最安全的选择是的,但偶尔浏览一个文件夹并不是我真正想要的。。。但是如果没有别的办法!但是不是,您可以设置一个cron脚本来执行此清理,或者在每个请求上执行此清理(将时间戳保存在某个位置并在每个请求上检查:如果时间戳太旧,请运行脚本并更新时间戳)。没有所谓的“手册”;-)我已经在预览文件并调整其大小时将其移出!但你不必这么做。您可以从/tmp预览它,并且可以显式地将调整大小的版本保存到/tmp,然后在得到验证时将其移动。顺便问一下,是否可以以某种方式检查文件期限?或者我必须给文件名加上时间戳吗?你可能想看看和。这几乎可以肯定是我要解决的问题。