Как удалить файл, когда пользователь покидает страницу? - PullRequest
4 голосов
/ 18 ноября 2009

У меня есть форма с действием, установленным в php-файл (verify.php). В форме я сделал довольно хороший раздел загрузки изображений. После отправки формы открывается файл verify.php для проверки формы, заполненной пользователем.

Все значения формы размещены внутри другой формы на странице verify.php. Только изображение загружается в папку на сервере, и это моя проблема. Я хочу, чтобы изображение было удалено, если пользователь сожалеет (не проверяет) о размещении рекламы, или если пользователь возвращается, чтобы изменить объявление снова.

Как бы я это сделал?

Одним из способов может быть удаление имени файла всякий раз, когда страница «unLoads» (пользователь нажимает кнопку «Назад»). Но это не решит проблему, если пользователь закроет браузер на странице verify.php, потому что это не считается «разгрузкой», не так ли?

Решения

Если вам нужно больше информации, скажите мне, и я обновлю этот пост!

Спасибо

Ответы [ 11 ]

7 голосов
/ 18 ноября 2009

К сожалению, это довольно сложная вещь, проще было бы проверить, какие файлы устарели, и удалить их при следующем доступе к странице. Это может быть сделано полностью через PHP и будет очень надежным.

2 голосов
/ 18 ноября 2009

Может быть, я неправильно понял, но процесс может быть таким:

1 Пользователь загружает файл (который обычно идет в папку * nix / tmp)

2 Вы перемещаете файл во вторую временную папку / upload_unconfirmed

3 Когда пользователь фактически подтверждает действие, вы затем а) переместите его в свою папку, чтобы сохранить его постоянно, скажем, /clientfolder/theirusername.jpg б) затем удалите их имя пользователя.jpg в / upload_unconfirmed

В фоновом режиме запустите cron для каждого файла старше, чем, скажем, 1 час, в / upload_unconfirmed / *

Если у каждого клиента только одно изображение, последующие загрузки перезапишут его старый файл.

1 голос
/ 31 августа 2011

Вот как вы это делаете:

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 и загружает файлы (например, резюме, мотивационное письмо ...), если он уходит без отправки, файлы и папка удаляются.

1 голос
/ 18 ноября 2009

Я бы назвал изображение по времени (используя функцию time ()) как 1258560055.jpg, а затем построил бы задание cron, которое удаляло бы каждое изображение через час, два часа или еще позже.

1 голос
/ 18 ноября 2009

Не перемещайте файл в его постоянное местоположение, пока пользователь явно не проверит. PHP помещает загруженные файлы в определенное место, обычно в каталог / tmp (в установках * nix), который автоматически очищается в порядке fifo по мере необходимости. Поэтому, если вы не переместите файл из этого специального каталога, он будет автоматически очищен без вашего дальнейшего вмешательства в неуказанное время в будущем.

1 голос
/ 18 ноября 2009

обычно, серверный скрипт не знает, что пользователь покидает страницу или закрывает браузер, он может только проверять время ожидания сеанса, но обычно его значение составляет 30 минут или больше, зависит от настроек.

Так что, если вам действительно нравится делать это в реальном времени, установите ajax timer на страницах и отправляйте hello запрос каждые 30 секунд или что-то подобное на сервер, а затем вы можете удалить файл изображения, если нет ответа более 1 минуты или что-то в этом роде.

Но отправка ajax-запроса на сервер каждые 30 с или менее может повлиять на производительность сервера, если на нем много пользователей.

1 голос
/ 18 ноября 2009

Обнаружение «отказов», таких как закрытие браузера, по существу невозможно. Не существует надежного способа отслеживать его на стороне сервера в режиме реального времени. Самый простой способ удалить эти изображения - настроить запущенный процесс, который удаляет изображения, связанные с оставленными одиночками.

0 голосов
/ 18 ноября 2009

Не могли бы вы просто загрузить изображение после проверки отправленных данных?

0 голосов
/ 18 ноября 2009

Настройка записи базы данных для каждого файла с отметкой времени. Затем, когда ваш процесс будет завершен, удалите эту запись. Затем один раз в день просматривайте таблицу, удаляйте все оставшиеся там файлы и удаляйте эти записи из таблицы ... это самая безопасная ставка.

0 голосов
/ 18 ноября 2009

Я не думаю, что очень легко определить, когда пользователь действительно покидает страницу. Большинство решений, которые я вижу, обычно выполняют какое-то действие (например, удаление временных файлов) по истечении времени сеанса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...