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

Я пытаюсь реализовать модуль загрузки на веб-сайте, который позволил бы нашим пользователям загружать видео в нашу учетную запись Vimeo. Я использую jQuery File Upload от 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, и также получил меньшее число байтов, чем то, что отправлено в заголовках, 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 «:» чт, 03 октября 2024 17 «,» Content-Length «:» 184 «,» X-Cnection «:» close «,» Тип содержимого «:» application / vnd.vimeo.error + json «,» Via «:» 1.1 dca1-10 «}}

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

Спасибо !

[редактировать] Большое спасибо Dashron, мне фактически пришлось установить для параметра multipart в 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 заголовок (см. зачеркнутый текст выше). Благодаря blueimpПомогите, я обнаружил, что вы можете просто удалить этот заголовок в fileuploadsend Перезвоните :

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

6

Решение

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]