【问题标题】:How to delete a file whenever user leaves page?用户离开页面时如何删除文件?
【发布时间】:2009-11-18 15:53:02
【问题描述】:

我有一个表单,其操作设置为 php 文件 (verify.php)。 在表格中,我做了一个非常漂亮的图片上传部分。 提交表单后,打开verify.php对用户填写的表单进行验证。

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

我该怎么做?

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

解决方案?

如果您需要更多信息,请告诉我,我会更新这篇文章!

谢谢

【问题讨论】:

  • 为什么这个过程有两个步骤?我觉得很难理解,但您似乎有一个用户填写的表格,它上传了他们的信息 + 图片,然后还有另一个页面来验证广告?

标签: php javascript html


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

1 用户上传文件(正常进入 *nix /tmp 文件夹)

2 您将文件移动到第二个临时文件夹 /upload_unconfirmed

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

在后台运行 cron 以 rm 在 /upload_unconfirmed/* 中超过 1 小时的每个文件

如果每个客户端只有一张图片,那么后续上传将覆盖他们的旧文件。

【讨论】:

  • 我几乎肯定会这样处理它。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    所以如果你真的喜欢实时做,把ajax定时器放在页面中,每30秒发送hello请求或者类似的东西到服务器,然后你可以删除图像文件如果超过 1 分钟没有响应或类似情况。

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 我已经在预览和调整文件大小时将文件移出!
      • 但你不必这样做。您可以从 /tmp 预览它,并且可以将调整大小的版本显式保存到 /tmp,然后在获得验证时将其移动。
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        这就是你的做法:

        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
            }
        }
        

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

        【讨论】:

          【解决方案8】:

          我会对用户确认其广告发布的时间设置一个时间限制。然后,有一个将在该预定时间触发的监控作业,如果广告尚未确认,则从服务器中删除该图像。

          【讨论】:

          • 但是如果用户返回并选择另一个图像,第一个时间限制的过程不会中止或什么......嗯
          • 如果用户可以选择上传不同的文件,那么上传进程似乎会检查当前进程(用户会话、令牌等)是否已经在服务器。如果是,请删除该文件,然后将新文件保存到服务器。
          【解决方案9】:

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

          【讨论】:

            【解决方案10】:

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

            【讨论】:

            • 你的意思是手动?可能是最安全的选择,是的,但时不时地浏览一个文件夹并不是我真正想要的……但如果没有其他办法!
            • 但是不,您设置了一个 cron 脚本来执行此清理,或者您对每个请求都执行此操作(在某处保存时间戳并在每个请求上检查它:如果它太旧,请运行脚本,并更新时间戳)。没有“手动”之类的东西;-)
            【解决方案11】:

            验证提交的数据后不能直接上传图片吗?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多