API Vimeo: потоковая загрузка с использованием HTTP PUT и загрузки jQuery для синейма

Я пытаюсь реализовать модуль загрузки на веб-сайте, который позволит нашим пользователям загружать видео в нашу учетную запись Vimeo. Я использую загрузку jQuery файла blueimp и новый API Vimeo. https://github.com/blueimp/jQuery-File-Upload/wiki/Options https://developer.vimeo.com/api/upload#http-put-uploading Я думаю, что он близок к работе, но я должен отсутствовать некоторые подробности. Согласно API Vimeo, мне нужно: 1. Создать билет на загрузку, который отлично работает 2. Затем я передаю upload_link_secure на загрузку файла jquery, который начинает загрузку. Это то, что заголовки запросов для запроса PUT выглядят так:

Request Method:PUT Status Code:200 OK Accept:*/* Accept-Encoding:gzip,deflate,sdch Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 Connection:keep-alive Content-Length:43418955 Content-Type:multipart/form-data; boundary=----WebKitFormBoundarye8sGy57JH6ACoOfJ 

Вот как я вызываю загрузку файла jQuery:

 $('#file').fileupload({ url: upload_link_secure, type: 'PUT' }); 

Я также попытался заставить заголовок Content-Type «video / mp4», но это не имеет никакого значения в конце.

Я также проверил размер файла, связав событие jquery fileupload submit, и я также получил более низкий байт, чем то, что отправлено в заголовках, 43418764 в этом примере, это нормально?

  1. Проверьте загрузку, отправив PUT-запросы на upload_link_secure, некоторые заголовки ответов, которые я получаю:

Код состояния: 308 Резюме не завершено

Диапазон: байт = 0-3948544

Код состояния: 308 Резюме не завершено

Диапазон: байт = 0-38682624

Код состояния: 308 Резюме не завершено

Диапазон: байт = 0-43401216

  1. Убедитесь, что все байты сделали это Vimeo, затем заполните загрузку, отправив запрос DELETE на complete_uri. Я получаю этот последний заголовок при проверке загрузки:

Диапазон: байт = 0-43418955

Кажется, что он соответствует запросу Content-Length в первом запросе, поэтому я выполняю запрос DELETE, и это ответ, который я получаю:

{"body": {"error": "Ваш видеофайл недействителен, либо вы загрузили неверный формат файла, либо ваша загрузка была неполной. Убедитесь, что вы подтвердили свою загрузку, прежде чем пометить ее как завершенную."}, "status ": 400," headers ": {" Date ":« Mon, 06 Oct 2014 17 »,« Server »:« Apache »,« Vary »:« Accept, Vimeo-Client-Id, Accept-Encoding »,« Cache -Control ":" no-cache, max-age = 315360000 "," Expires ":" Thu, 03 Oct 2024 17 "," Content-Length ":" 184 "," X-Cnection ":" close "," Content-Type ":" application / vnd.vimeo.error + json "," Via ":" 1.1 dca1-10 "}}

Я, должно быть, совершил очень тупые ошибки, но я не очень хорошо знаком со всеми этими HTTP-запросами и репонами, кто-нибудь знает, что я сделал неправильно?

Благодаря !

[edit] Спасибо большое Dashron, мне на самом деле пришлось установить многостраничную опцию jQuery fileupload в false:

 $('#file').fileupload({ url: upload_link_secure, type: 'PUT', multipart: false }); 

После этого я получил эту ошибку HTTP:

 XMLHttpRequest cannot load https://1511632921.cloud.vimeo.com/upload?[...]. Request header field Content-Disposition is not allowed by Access-Control-Allow-Headers. 

Для этого может быть чистое исправление, но я не нашел его, поэтому просто прокомментировал строки, которые устанавливают заголовок Content-Disposition в jquery.fileupload.js

 // if (!multipart || options.blob || !this._isInstanceOf('File', file)) { // options.headers['Content-Disposition'] = 'attachment; filename="' + // encodeURI(file.name) + '"'; // } 

(см. edit3 )

Теперь он отлично работает! 🙂

[edit2] Мне был предложен более полный пример кода, который я придумал, чтобы сделать эту загрузку PUT, поэтому здесь есть Gist, содержащий соответствующий шаблон Twig из моего приложения Symfony. Надеюсь, это достаточно ясно, и это может помочь. Возможно, код можно улучшить, но я думаю, что это хорошая отправная точка. https://gist.github.com/paulgv/13ff6d194bc0d662de7b

[edit3] Я также понимаю, что я никогда не обновлял свой код с более чистым исправлением проблемы, Content-Disposition заголовком Content-Disposition (см. выше текст выше). Благодаря помощи blueimp , я узнал, что вы можете просто удалить этот заголовок в fileuploadsend :

 .bind('fileuploadsend', function (e, data) { data.headers = {}; }) 

Загрузка PUT не поддерживает многостраничную кодировку. Загрузка PUT должна иметь тело запроса только сырых байтов файла.

Multipart поддерживается при загрузке POST, но POST-заказы не поддерживают возобновляемые загрузки или заголовки диапазонов.