Хорошо, в моей голове это несколько сложно, и я надеюсь, что смогу это объяснить.Если что-то неясно, пожалуйста, прокомментируйте, чтобы я мог уточнить вопрос.
Я хочу обработать загрузку пользовательских файлов на 3-й сервер.
Итак, у нас есть
- Пользователь
- веб-сайт (сервер, на котором работает веб-сайт)
- сервер хранения (который получаетфайл)
Поток должен выглядеть следующим образом:
Веб-сайт запрашивает URL-адрес загрузки со шлюза облачных хранилищ, который указывает непосредственно на конечный сервер хранения (что-то вроде http://serverXY.mystorage.com/upload.php). Вместе с запросом отправляется «целевой путь» (специфичный для сайта и глобально уникальный) и URL-адрес перенаправления.
Сайт генерирует форму загрузки ссерверы хранения загружают URL-адрес в качестве цели, пользователь выбирает файл и нажимает кнопку отправки. Сервер хранения обрабатывает запрос на публикацию, сохраняет файл во временную папку ('/tmp-directory/'.sha1(target-path-fromabove)
) и перенаправляет обратно на URL-адрес перенаправления, которыйвеб-сайт был указан. «Путь к цели» также пропущен.
Я не хочу, чтобы какие-либо «скрытые файлы» оставались, если пользователь отменяет процесс илисоединение гЭто прервано или что-то!Также следует избегать записей в базе данных веб-сайтов, которые не были правильно обработаны в облачном хранилище, а затем повреждены.Вот причина этого и следующего шага
Это критические шаги
- Теперь веб-сайт записывает запись в свою собственную базу данных, ивыдает повторный запрос к API хранилища (подписано, веб-сайт должен пройти проверку подлинности с использованием секретного токена), чтобы
- копировал файл из своего временного местоположения на сервере хранилища в его окончательное местоположение (это должно быть быстрым, потому что это толькопереименовать)
- тот же запрос на отдых также вставляет строку базы данных в базу данных сетей хранения вместе с идентификатором веб-сайта как владельца
Все файлы в каталоге tmp включенысервер хранения старше 24 часов автоматически удаляется.
Если пользователь закрывает окно браузера или соединение прерывается, выполнение программы на сервере также прерывается, верно?Выполняются только деструкторы и зарегистрированные функции выключения, верно?
Можно ли как-то сделать эту часть кода "критической", чтобы сервер, если он однажды входит в эту часть кода, выполнял его до конца независимо от того, является ли пользовательпрерывает загрузку страницы или нет?
(Конечно, я знаю, что сбой сервера или ошибка могут прерваться в любое время, но сейчас я беспокоюсь о регулярном потоке)
Один из меня должен был иметь флаг ивременная метка в базе данных веб-сайтов, которая помечает файл как «завершенный» и проверяет хронологию на наличие старых незавершенных файлов и удаляет их из облака хранения, а затем из базы данных веб-сайтов, но я действительно хотел бы избежать этого дополнительного поля и процедуры.
Я хочу, чтобы API хранилища был очень универсальным и использовал его во многих других будущих проектах.
Я посмотрел на хранилище Google для разработчиков и Amazon s3.
Ониесть такая же проблема и даже хуже.В Amazon S3 вы можете «подписать» свой почтовый запрос.Таким образом, файл загружается пользователем под вашим руководством и сохраняется и сохраняется напрямую, и вы должны оплатить его.Если соединение прерывается и пользователь никогда не возвращается на ваш сайт, вы даже не знаете об этом.Таким образом, вы должны хранить все загружаемые вами URL-адреса, подписывать их, проверять их в cronjob и удалять все, что не «достигло места назначения».
Какие-либо идеи или рекомендации для этой проблемы?