Vimeo CORS Issue
Я пытаюсь загрузить видео в Vimeo через Ajax, но у меня возникают проблемы с CORS в Firefox.
Вот код, который я использую. Только на последнем этапе публикации файла защита CORS предотвращает загрузку.
Я проверил заголовки, и Cross Origin установлен правильно.
$.ajax({
url:'https://api.vimeo.com/me',
crossDomain:true,
headers:{Authorization: 'bearer ',Accept:'application/vnd.vimeo.*+json;version=3.2'},
error:function(){
videoError('Couldn\'t get a quota');
},
success:function(uploadQuota){
if(uploadQuota.upload_quota.space.free > 0 && (uploadQuota.upload_quota.quota.sd == true || uploadQuota.upload_quota.quota.hd == true)){
//Get Upload Ticket
$.ajax({
url:'https://api.vimeo.com/me/videos',
data:{type:'POST'},
type:'POST',
dataType:'json',
crossDomain:true,
headers:{Authorization: 'bearer ',Accept:'application/vnd.vimeo.*+json;version=3.2'},
error:function(){
videoError('Couldn\'t get a ticket');
},
success:function(uploadTicket){
if(uploadTicket.ticket_id != ''){
//Upload File
var videoData = new FormData();
$.each($('#video_upload')[0].files, function(i, file) {
videoData.append('file_data', file);
});
$.ajax({
url:uploadTicket.upload_link_secure,
type:'POST',
headers:{Authorization: 'bearer ',Accept:'application/vnd.vimeo.*+json;version=3.2'},
data: videoData,
cache: false,
contentType: 'multipart/form-data',
processData: false,
crossDomain:true,
//dataType:'jsonp',
error:function(){
videoError('Error uploading video. Please contact FDN with the ticket id:'+uploadTicket.ticket_id);
},
success:function(uploadData,status){
//Copy id to text box
}
});
} else {
//If none, process error
}
}
});
} else {
//If none, process error
}
}
});
Есть ли что-то очевидное, что я пропустил или могу попробовать?
2 ответа
Краткий ответ: загрузка Vimeo POST не была разработана для клиентского JavaScript. Система загрузки PUT имеет 100% поддержку CORS.
Длинный ответ:
Загрузки Vimeo POST были разработаны, чтобы обеспечить невероятно простую загрузку. Мы даем вам форму. Вы помещаете форму в HTML-страницу вашей, пользователь использует форму, и все установлено. Это не поддерживает индикаторы выполнения. Это не возобновимо.
При загрузке видео мы должны выполнить некоторую постобработку, прежде чем видео станет доступно. Текущая система загрузки POST обрабатывает это автоматически, перенаправляя клиента после завершения загрузки. К сожалению, есть некоторые проблемы с CORS и перенаправлениями (у меня возникают проблемы с поиском деталей, но если я правильно помню, спецификации специфицируются для обработки определенных перенаправлений как ошибки).
Прямо сейчас вы должны завершить загрузку самостоятельно. Мы работаем над улучшением этого, но на данный момент вы должны найти URL в заголовке "location" ответа от вашего POST. Сделайте запрос GET на этот URL, и ваша загрузка будет завершена.
Загрузки Vimeo PUT были разработаны как полнофункциональная расширенная система загрузки. Они являются возобновляемыми, потоковый дизайн легко поддерживает индикаторы выполнения. Вы можете запросить статус загрузки, а также запускать и останавливать все по команде. CORS поддерживается на 100%. Это потребует использования файлового объекта HTML5, который имеет ограниченную поддержку, например, 9 и ниже.
[Редактировать] В настоящее время существует неофициальный скрипт загрузки видео на стороне клиента для потокового рабочего процесса. Вы можете найти его здесь: https://github.com/websemantics/vimeo-upload
Как упомянул @Dashron, "Простая загрузка HTTP POST" должна использоваться для простых случаев. Например, если вы хотите возобновить загрузку, вы должны использовать "Resumeble HTTP PUT uploads".
Тем не менее, почти во всех ссылках на похожие проблемы отсутствуют две части информации, которыми я хотел бы поделиться.
1) Будьте осторожны при использовании vimeo-upload
Как упомянул @PaulLoomijmans в комментарии к @Dashron, vimeo-upload (github.com/websemantics/vimeo-upload) требует, чтобы вы выставили свой токен, что плохо по соображениям безопасности.
На самом деле я просто оставил в хранилище предложение, что было бы очень полезно, если бы мы могли использовать его с upload_url из vimeo, так как тогда нам не пришлось бы выставлять свой токен.
2) Вы можете проверить прогресс загрузки, используя метод загрузки POST
Если вы, как и я, просто хотите иметь возможность сообщать пользователю о ходе загрузки, используя упрощенный процесс загрузки "Простая загрузка HTTP POST", вы на самом деле можете сделать это без метода PUT.
Несмотря на то, что документально не задокументировано, при использовании "Простая загрузка HTTP POST" у вас также есть "upload_link_secure" в первоначальном ответе ( https://developer.vimeo.com/api/upload/videos), и вы можете использовать это, как если бы вы использовали "Resumeble HTTP PUT uploads" для проверки вашего процесса загрузки.
Таким образом, даже при использовании "Простая загрузка HTTP POST" вы можете следить за информацией о "подтверждении загрузки" в "Повторной загрузке HTTP PUT" (здесь: https://developer.vimeo.com/api/upload/videos). Возможно, описанные здесь функции возобновления не сработают, но вы можете проверить ход загрузки и показать его пользователю во время загрузки. Я фактически реализовал это, чтобы показать индикатор выполнения в моем веб-приложении.
Я надеюсь, что это кому-то поможет, так как я переключался между двумя методами загрузки из-за ограничений / сложности каждого из них.