Загрузка большого файла с помощью модели

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Krown
Сообщения: 13
Зарегистрирован: 2018.10.31, 17:57

Загрузка большого файла с помощью модели

Сообщение Krown »

Появилась необходимость отправлять простую форму с текстовыми полями и 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 паттерна отправить файл по частям и сделать корректную обработку модели? Все становится еще сложнее, если помимо файла в модели присутствуют другие поля (имя, текст, дата и многое прочее свойственное блогам и т.п.), которые просто потеряются во время отправки. Направьте на путь истинный.
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Загрузка большого файла с помощью модели

Сообщение yiijeka »

https://www.plupload.com/

Готовая вещь. Встраиваете себе в форму, когда файл будет загружен с помощью этой штуки у вас в input будет имя конечного файла, который будет лежать на сервере во временной директории. Дальше следует стандартная отправка формы со всеми полями, среди которых будет имя файла. По имени находите файл во временной директории, переносите в конечное местоположение и связываете с моделью данных..
Krown
Сообщения: 13
Зарегистрирован: 2018.10.31, 17:57

Re: Загрузка большого файла с помощью модели

Сообщение Krown »

yiijeka писал(а): 2019.07.09, 14:57 https://www.plupload.com/

Готовая вещь. Встраиваете себе в форму, когда файл будет загружен с помощью этой штуки у вас в input будет имя конечного файла, который будет лежать на сервере во временной директории. Дальше следует стандартная отправка формы со всеми полями, среди которых будет имя файла. По имени находите файл во временной директории, переносите в конечное местоположение и связываете с моделью данных..
Я правильно понимаю, что с этой либой загрузка происходит фоном у клиента, а на сервер оперирует уже полностью готовым файлом?
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Загрузка большого файла с помощью модели

Сообщение yiijeka »

Да, всё так.
Ответить