Как связать загрузку файлов с отправкой формы, которая еще не была создана? - PullRequest
0 голосов
/ 29 мая 2018

Я создаю традиционное серверное приложение HTML (использующее Statamic поверх PHP), которое позволяет пользователям создавать идеи.Они посещают форму «Создать идею», заполняют некоторые вопросы и нажимают кнопку «Отправить».Как только они это сделают, форма отправляет запрос POST на сервер, который затем сохраняет данные, генерируя идентификатор (и слаг) для идеи.

Теперь я хотел бы позволить пользователям загружать файлыкак часть их идеи.Конечно, старомодным способом сделать это было бы просто добавить в форму входные данные из файла, а затем сразу отправить все данные (данные и файлы).Сервер может создать идентификатор, а затем связать файлы с идентификатором.

Однако этот подход имеет некоторые недостатки, не в последнюю очередь из-за задержки с ожиданием загрузки файлов как части формы.процесс представления.Более современные реализации, как представляется, загружают файлы, как только они были добавлены (например, с помощью перетаскивания).Например, я определил FilePond в качестве лидера, иначе я бы, вероятно, использовал Dropzone.js .

Однако, если браузер отправляет файлы до того, как пользователь отправил форму, как я могу наилучшим образом связать файлы с данными формы?У меня еще нет идентификатора для использования.

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

  1. Создайте GUID как часть формы.Отправить это с любой загрузки файла.Сохраните его (как скрытое поле) как часть данных формы, если и когда форма в конечном итоге будет отправлена.
  2. Требуйте, чтобы пользователь отправил форму (сохранить черновик), прежде чем разрешать загрузку файлов.Очевидно, что это не очень удобно для пользователя.
  3. Как вариант 2) выше, автоматически отправляйте форму через Ajax в какой-то момент, прежде чем пользователь начнет загружать файлы.

I'mсклоняясь к решению 1, но хотел понять, о чем я не думаю.2 не очень хорош из-за сбивающего с толку UX, и 3 кажется не совсем идеальным, например, потому что я мог бы закончить тем, что сохранил черновики идей, которые пользователь на самом деле никогда не спасает (и откажется), и отчасти потому, что генерируемый слаг может бытьна основе отсутствующего или неполного заголовка, поскольку пользователь, возможно, не заполнил поле заголовка до загрузки файлов.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Документация для FilePond, на самом деле, содержит описание рекомендуемой настройки :

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

Процесс загрузки, описанный во времени:

  1. клиент загружает файл my-file.jpg как multipart / form-данных с использованием запроса POST
  2. сервер сохраняет файл в уникальном месте tmp / 12345 / my-file.jpg
  3. сервер возвращает уникальный идентификатор местоположения 12345 в текстовом / простом ответе
  4. клиент хранит уникальный идентификатор 12345 в скрытом поле ввода
  5. клиент отправляет родительскую форму FilePond, содержащую скрытое поле ввода, с уникальным идентификатором
  6. сервер использует уникальный идентификатор для перемещения tmp / 12345 / my-file.jpg в его окончательное расположение и удалите папку tmp / 12345
0 голосов
/ 30 мая 2018

Вот мое предложение:

  • Загрузить файл немедленно (после проверки ..)
  • сделать запись в таблице "files" вашей базы данных с 1-м путем / именем файла(сделайте его уникальным!) и 2-ой уникальный, достаточно длинный токен
  • отправьте его обратно в форму (как результат загрузки) и
  • отправьте его вместе с формой в виде скрытого ввода.

Затем создайте cronjob, который удаляет все неиспользуемые файлы раз в час или около того.

...