Как правильно загрузить файлы и привязать их к сущности?
Всем привет!
Подскажите, кто как грузит файлы? и как это лучше делать?
Суть вот в чем: пользователь хочет создать какой-то пост, заходит в форму создания поста, в форме есть загрузчики файлов. Когда пользователь выбирает файл, файл должен сразу загружаться на сервер, потом пользователь заполняет остальные поля и отправляет POST запрос на сервер.
Как при этом связать файлы на сервере с сущностью этого поста? Файлы уже на сервере, а сам пост еще не создан.
Вижу два варианта, но они кажутся костыльными:
1. Создавать пост при открытии формы и возвращать его id, этот id привязывать к файлам на фронте и отправлять файлы на сервер с привязкой, а при сохранении формы делать PUT.
2. Грузить файлы во временную папку, а при сохранении поста сравнивать имена файлов и имя пользователя и по ним привязывать к посту и перемещать из временной папки куда надо.
Грузить файл во временную папку и при этом задавать файлу рандомное уникальное имя. Во время поста передавать связку действительное_имя - рандомное_имя.
Рандомное уникальное имя должен задавать сервер и возвращать его как ответ поста.
German Jet, Ну я делаю сейчас следующим образом:
1. Файл filename грузится на сервер в папку temp, в имя добавляю уникальный префикс, к примеру uuid_filename, сохраняю данные файла в бд.
2. В респонсе после сохранения отдаю id сохраненного файла и имя uuid_filename на фронт, добавляю их в форму поста (массив post_files, например).
3. При сохранении поста отправляю форму на сервер. Пост сохраняется в бд.
4. id сохраненного поста проставляю в бд у уже сохраненных файлов (данные этих файлов мне пришли в массиве post_files, поэтому я знаю у каких именно файлов мне нужно указать id поста), и перемещаю в уже нужное мне место.
В принципе uuid_filename можно не передавать обратно, достаточно id файла, но сам префикс нужен чтобы файлы в одной папке не перезаписывали друг друга, если разные пользователи грузят файлы с одинаковым именем.
Как-то сумбурно описал, конечно. Но если есть вопросы, постараюсь ответить
1. Не сохранять данные о загруженном файле в БД. Это пустая трата времени и энергии. Вам потом прийдётся писать отдельный скрипт чтоб избавляться от временных файлов, которые пользователи передумали загружать
2. Файлы грузятся во временную директорию, которая чистится автоматически
3. Временная директория не видна наружу ни в коем случае. Потому что в противном случае это будет нереальная дыра в безопасности
4. Любые данные о файле вы можете получить джаваскриптом до загрузки. Не нужно утомлять сервер последующими обращениями к временному файлу
5. Никаких uuid. Если пользуетесь пхп, то php.net/manual/en/function.tempnam.php . Для других языков/фреймворков ищите по запросу "generate unique file name"
Demian Smith, Спасибо! А чем плох uuid? То что он длинный и могут возникнуть проблемы с длинными путями к файлу?
Как раз вот подобным запросом для python по первой ссылке предлагают использовать uuid
airwave, UUID не плох. Меня смутило что при генерации случайного имени файла не будет выполняться проверка на уже существующее имя (всымсле такую проверку прийдётся делать вручную). Немного погуглив увидел что если библиотека по генерации UUID не глючная, то вероятностью совпадения можно пренебречь.
Хотя, если честно, я бы не стал пренебрегать проверкой на коллизии. Потому что это, типа, правильно. Ну и знаю уйму людей, которые устроили бы разбирательство по этому поводу. Я бы сделал проверку чтоб не спорить с такими параноиками :)