API. Предварительная загрузка файла

Создано api с использованием спецификации JSON:API. Но она не предусматривает загрузку файлов. И поэтому было принято решение создавать ресурсы в два этапа:

  1. Предварительная загрузка изображений во временную папку без привязки к ресурсу
  2. Сохранение ресурса с привязкой ранее загруженного изображения

Есть ли спецификация, описывающий данный метод сохранения? Как очищать временное хранилище от ненужных файлов?


Ответы (1 шт):

Автор решения: Dinario

Для примера возьмем ресурс posts с полем image. Видится несколько вариантов:

1. Временное хранилище

Сначала загружаем файл во временную папку, а также заносим в бд. Например, в таблицу temporary_storage с полями id, type, path, created_at. Валидация файла проходит здесь же. Ссылка может быть такой /posts/upload. Возвращаем клиенту id и path.

Далее сохраняем сам ресурс. Перемещаем файл из временного хранилища в постоянное. И удаляем запись с таблицы temporary_storage.

При таком подходе можно удалять ненужные файлы, например, созданные более дня назад.

2. Сначала сохранение ресурса

Делаем поле image необязательным и добавляем поле status. Сохраняем ресурс без картинки и ставим статус черновика. Далее загружаем файл, валидируем его. Из-за статуса черновика мы не боимся ошибки загрузки файла.

3. Постоянное хранилище

Как предложил @Mike, можно создать отдельный ресурс для файлов, и связыать их с другими ресурсами. Но этот метод нам не совсем подходит из-за дополнительной сложности очистки ненужных файлов и валидации файлов.

Вывод: Первый метод кажется более универсальным и масштабируемым. Но второй способ определенно легче. На данном этапе мы склоняемся ко второму варианту.

→ Ссылка