Появилась необходимость отправлять простую форму с текстовыми полями и file input'ом, при этом размер файла может быть свыше 2 GB. Так как менять директивы в php_ini не было возможности, да и смотрят на это как на плохую практику - было принято решение разделять файл на чанки и отправлять их в цикле последовательно, а в конце собирать все в единый файл. Соответственно стандартный метод отправки формы сразу же отпадает и приходится реализовывать отправку с помощью JS:
Код: Выделить всё
async function upload(file) {
let chunks = sliceFile(file, 100000000); //функция, возвращающая массив FormData элементов, заполненных blob'ами большого файла по ~100 Мб.
...
for (part of chunks) {
await $.ajax({
url: '/site/chunk-upload',
type: 'post',
contentType: false,
processData: false,
data: part
//await для последовательной загрузки кусков, чтобы не убивать сервер запросами и удобнее "клеить" все в один файл
}).fail(...);
}
$.ajax({
... ajax запрос на проверку целостности файла и сохранение его имени в БД и т.д.
})
}
Загрузка файлов чанками влечет за собой отправку файла отдельными запросами. Отсюда вопрос, как правильно с точки зрения архитектуры Yii2 и MVC паттерна отправить файл по частям и сделать корректную обработку модели? Все становится еще сложнее, если помимо файла в модели присутствуют другие поля (имя, текст, дата и многое прочее свойственное блогам и т.п.), которые просто потеряются во время отправки. Направьте на путь истинный.