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

4
我有一个表单,它的操作设置为一个php文件(verify.php)。 在表单中,我制作了一个相当不错的图片上传部分。 提交表单后,打开verify.php以验证用户填写的表单。
表单值都放在verify.php页面上的另一个表单中。 只有图片被上传到服务器上的一个文件夹中,这是我的问题。 如果用户后悔(未确认),或者用户返回更改广告,我希望删除该图片。
我应该如何做呢?
一种方法是在页面“卸载”时(用户点击返回按钮)删除文件名。但是,如果用户关闭verify.php页面,这种方法无法解决问题,因为那并不算作“卸载”,对吗?
有什么解决方案吗?
如果需要更多输入,请告诉我,我会更新此帖子!
谢谢

为什么这个过程需要两个步骤?我很难理解,但似乎您有一个表单供用户填写,他们可以上传信息和图片,然后另外有一个页面用于确认广告。 - Ben Everard
11个回答

7

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


顺便问一下,有没有办法检查文件的年龄?还是我必须为此给文件名加上时间戳? - user188962
1
你可能想要查看 http://php.net/manual/en/function.filemtime.php 和 http://www.php.net/manual/en/function.filectime.php。 - tplaner

3
也许我误解了,但是流程可能是这样的:
1. 用户上传文件(像往常一样进入*nix /tmp文件夹)。
2. 您将文件移动到第二个临时文件夹/upload_unconfirmed。
3. 当用户实际上确认操作后,您就会: a) 将其移动到永久保留的文件夹中,例如/clientfolder/theirusername.jpg b) 然后删除/upload_unconfirmed中theirusername.jpg
在后台运行一个cron来删除/upload_unconfirmed/*中早于1小时的所有文件。
如果每个客户只有一个图像,则后续上传将覆盖其旧文件。

那几乎肯定是我会解决它的方式。 - ale

1

这是如何做到的:

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');
});

PHP:

if(isset($_POST['value'])){

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

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

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


1
检测像浏览器关闭这样的“放弃”实际上是不可能的。在服务器端实时跟踪它的可靠方法不存在。删除这些图像最简单的方法是设置一个运行中的进程,删除与放弃注册相关联的图像。

1
通常情况下,服务器端脚本无法知道用户是否离开页面或关闭浏览器,它只能检查会话超时,但通常设置为30分钟或更长时间。
因此,如果您真的想实时处理,可以在页面中放置ajax计时器,并每30秒或类似时间向服务器发送“hello”请求,然后如果超过1分钟没有响应,就可以删除图像文件之类的东西。
但是,如果您有很多用户使用它,每30秒或更短时间向服务器发送ajax请求可能会影响服务器性能。

1

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


我已经将文件移出,因为我在预览和调整大小! - user188962
1
但你不需要这样做。你可以从/tmp预览它,并且可以显式地将缩略图保存到/tmp,然后在获得验证后再移动。 - dnagirl

1

我会使用时钟函数(time() 函数)按纪元时间命名图像,例如1258560055.jpg,然后创建一个定时任务,每小时、两个小时或其他时间间隔删除每张图像。


0

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


但是如果用户返回并选择另一张图片,第一次限制的过程不会被中止或其他什么吗... 嗯 - user188962
如果用户有上传不同文件的选项,那么似乎上传过程会检查当前进程(用户会话、令牌等)是否已在服务器上关联了一个文件。如果是,则删除该文件,然后将新文件保存到服务器上。 - Mike Clark

0

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


0

为每个文件设置带有时间戳的数据库条目。然后,当您的进程完成时,删除该条目。然后,每天一次,浏览表格,删除仍在其中的所有文件,并从表格中删除这些记录... 这是最安全的选择。


你的意思是手动操作吗?这可能是最安全的选择,但是经常浏览文件夹并不是我想要的...但如果没有其他办法! - user188962
但是,你可以设置一个cron脚本来进行清理,或者在每个请求上进行清理(在某个地方保存时间戳,并在每个请求上检查它:如果时间戳太旧,则运行脚本并更新时间戳)。不存在所谓的“手动”;-) - Palantir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接