Мои пользователи должны иметь возможность загружать файлы на мой сайт, поэтому я реализовал виджет загрузки файлов на веб-интерфейсе. Он допускает несколько загрузок одновременно, и каждая загрузка запускает код по одному файлу за раз, чтобы сохранить файл в БД.
Проблема заключается в том, что файлы должны храниться в виде массива в одной строке в базе данных (я знаю, я знаю … устаревшие причины).
В английском псевдокоде вот что происходит:
Проблема в том, что когда несколько файлов загружаются одновременно в быстрой последовательности в первый раз, Laravel вводит первый файл в моменты базы данных после второй файл провел проверку, чтобы увидеть, существуют ли какие-либо файлы. Таким образом, мы получаем дублирующие строки, а не обновляем их в одну запись.
Если я загружаю 5 файлов одновременно, обычно я получаю 4 строки в базе данных — 3 отдельные записи и одну двойную запись, которые удалось наверстать упущенное во времени.
Есть ли практические способы обойти эту проблему? Я знаю, что мне следует использовать схему базы данных «многие к одному», но для краткости я значительно упростил и без того сложную ситуацию!
Это Laravel 5.2, использующий базу данных MySQL InnoDB.
План A: Когда вы увидите один новый файл, подождите немного. Затем найдите «все» файлы и разберитесь с ними.
План Б: Сохраните отметку времени вместе с записью. Когда другой файл замечен, посмотрите, существует ли существующая запись с «недавней» отметкой времени. Если это так, предположим, что это часть одной и той же «группы».
Оба Плана будут время от времени есть икота — в основном из-за расплывчатого определения «сразу».
Возможно, у вас сейчас есть другая проблема: файл загружается наполовину, когда вы его захватываете, и вы получаете неполный файл?
«Настоящий» ответ — загрузить «сообщение» после завершения. Затем не начинайте обработку, пока не увидите ее. (Я понимаю, что это, вероятно, не практично.)
Других решений пока нет …