Возобновляемая загрузка nginx с помощью upload_module и multipart/form

В настоящее время я загружаю веб-сервис на сервер nginx с помощью модуля загрузки (http://www.grid.net.ru/nginx/upload.en.html) из пользовательского настольного приложения, выполняющего простой многокомпонентный POST-запрос, который отправляет файл в одной части и закодированный в base64 XML с метаданными файла в другой часть.

Сервер получает этот POST, передает его моему веб-сервису, который читает метаданные, обрабатывает файл, и все в порядке.

Что я хочу сделать сейчас, так это использовать директиву upload_resumable модуля загрузки, чтобы выполнить POST несколькими фрагментами, чтобы свести к минимуму вероятность отключения и разрешить возобновление. В настоящее время я могу сделать это по протоколу, описанному здесь: http://www.grid.net.ru/nginx/resumable_uploads.en.html

Один отправляет диапазоны байтов файла вместе с некоторыми заголовками, чтобы идентифицировать фрагмент и сеанс в нескольких сообщениях, и после того, как все части будут загружены, nginx составит окончательный POST, содержащий имя файла и путь, и передаст его в ваше местоположение upload_pass ( что в моем случае CGI для приложения django).

Однако мне не ясно, как с помощью этого метода можно было бы отправить составное сообщение, поскольку протокол указывает, что тело POST должно состоять из байтов, указанных в диапазоне байтов. Мне нужно, чтобы последний пост также содержал XML, о котором я писал выше.

Я могу думать об отправке XML как первых байтов тела и заголовка, который указывает, сколько байтов принадлежит ему, но это будет означать дополнительную обработку конечного файла для удаления этого заголовка, а окончательные файлы потенциально находятся в диапазоне размеров ГБ. .

Любые другие идеи?


person Daniel Gollás    schedule 01.06.2011    source источник


Ответы (1)


Поскольку в протоколе, поддерживаемом nginx, прямо указано, что пост не должен быть составным, я отправил файл в теле, а остальные параметры закодировал в URL. Не самые красивые URL-адреса, но это работает.

person Daniel Gollás    schedule 16.06.2011
comment
что вы реализовали для клиента? это была вспышка? - person emh; 05.12.2011
comment
У меня есть пара клиентов, один на RealBasic с использованием настроенного HTTPSocket, а другой на Python с использованием модуля Requests. - person Daniel Gollás; 13.05.2013