Шаг 1 – получение URL для загрузки

Для этого используется метод video.getUploadUrl.

Так как загрузка производится для определенного пользователя, то понадобится либо access_token, либо session_key, а также разрешение VIDEO_CONTENT от пользователя.

После выполнения запроса к API получаем ответ, в котором указаны будущие id видео и url для загрузки.

Выполнив этот метод, можно перейти к следующему.

Шаг 2 – загрузка видео через HTTP POST

Непосредственная загрузка видео производится на upload_url из первого шага.

Например, при помощи curl:

curl -i -X POST \  
-H "Content-Type: multipart/form-data" \  
-F "data=@strange.mov" \  
"UPLOAD_URL"

Поддерживаются 2 способа заливки видео: multipart и возобновляемая загрузка

Multipart загрузка

Такая загрузка проще в реализации, но менее гибкая и не очень надёжная. Определяется по наличию заголовка “Content-Type: multipart/form-data” в HTTP-запросе.

Ограничения multipart загрузки:

  • Ограничение файлов до 2 Гб
  • Поддерживается только 1 файл на запрос
  • Не поддерживается докачка оборванной загрузки

Возобновляемая загрузка

Инициируется при наличии заголовка “Content-Type”, отличного от “multipart/form-data” в HTTP-запросе.

С помощью заголовка Content-Range указывается текущий диапазон и общий размер файла, например:

При разрыве соединения или какой-то ошибке, возможно продолжить загрузку с последнего места. Для этого нужно запросить у сервера последний известный байт и продолжить загрузку с этого места.
Возобновление загрузки имеет смысл после ошибок: REQUESTED_RANGE_NOT_SATISFIABLE и INTERNAL_SERVER_ERROR.

Получение статуса загрузки

Сделав GET-запрос по текущему URL можно получнить текущий статус загрузки: размер файла и последний известный байт. Эту информацию можно использовать для возобновления загрузки после обрыва связи.

Ответ

По заголовку HTTP-ответа можно судить об успешности загрузки видео:

КодИмяКомментарий
200OKФайл успешно загружен
201CREATEDУспешно загружена часть ranged-запроса
416REQUESTED_RANGE_NOT_SATISFIABLEОшибка в указанном диапазоне
403FORBIDDENОшибка доступа
500INTERNAL_SERVER_ERRORВнутренняя ошибка сервера

Шаг 3 – завершение добавления видео

После завершения загрузки видео будет доступно в “моих видеозаписях”, но будет не видно никому, кроме загрузившего его. Для завершения загрузки нужно принять соглашение. Соглашение автоматически принимается после успешного вызова метода video.update.