Я пытаюсь реализовать модуль загрузки на веб-сайте, который позволит нашим пользователям загружать видео в нашу учетную запись 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 в этом примере, это нормально?
Код состояния: 308 Резюме не завершено
Диапазон: байт = 0-3948544
Код состояния: 308 Резюме не завершено
Диапазон: байт = 0-38682624
Код состояния: 308 Резюме не завершено
Диапазон: байт = 0-43401216
Диапазон: байт = 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-заказы не поддерживают возобновляемые загрузки или заголовки диапазонов.