Выпуск Vimeo CORS

Я пытаюсь загрузить видео на 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
      }
  }                                                                                                                                                                                         
});

Есть ли что-то очевидное, что я пропустил или могу попробовать?


person tl8    schedule 18.11.2014    source источник


Ответы (2)


Краткий ответ: Vimeo загрузки POST не выполнялись предназначен для клиентского JavaScript. система загрузки PUT полностью поддерживает CORS.

Длинный ответ:

Загрузки Vimeo POST были разработаны, чтобы обеспечить невероятно простую загрузку. Мы даем вам форму. Вы помещаете форму в html своей страницы, пользователь использует форму, и все настроено. Это не поддерживает индикаторы выполнения. Это не возобновляемо.

При загрузке видео мы должны выполнить некоторую постобработку, прежде чем видео станет доступным. Текущая система загрузки POST обрабатывает это автоматически, перенаправляя клиента после завершения загрузки. К сожалению, есть некоторые проблемы с CORS и перенаправлениями (у меня проблемы с поиском деталей, но, если я правильно помню, в спецификации указано, что определенные перенаправления обрабатываются как случай ошибки).

Прямо сейчас вы должны завершить загрузку самостоятельно. Мы работаем над улучшением этого, но на данный момент вам нужно найти URL-адрес в заголовке «местоположение» ответа от вашего POST. Сделайте запрос GET на этот URL-адрес, и загрузка будет завершена.

Загрузка Vimeo PUT была разработана как полнофункциональная продвинутая система загрузки. Их можно возобновлять, потоковая конструкция легко поддерживает индикаторы выполнения. Вы можете запросить статус загрузки, а также запускать и останавливать все по команде. CORS поддерживается на 100%. Это потребует использования файлового объекта HTML5, который имеет ограниченную поддержку, т.е. 9 и ниже.

[Изменить] Теперь существует неофициальный сценарий загрузки видео на стороне клиента для потокового рабочего процесса. Вы можете найти его здесь: https://github.com/websemantics/vimeo-upload

person Dashron    schedule 18.11.2014
comment
Хорошо, я попробую использовать метод PUT и посмотрю, к чему это приведет. - person tl8; 19.11.2014
comment
Я попробовал метод PUT, но он все еще генерирует ошибку CORS или Firefox. - person tl8; 20.11.2014
comment
У вас есть более подробная информация о том, какой URL вызывает ошибку? - person Dashron; 21.11.2014
comment
Просто примечание для тех, кто обнаружит этот пост во время работы с Vimeo API: здесь есть сторонний загрузчик PUT на стороне клиента: github.com/websemantics/vimeo-upload и используется на многих веб-сайтах. Он успешно работает с cors! - person Dashron; 05.02.2016
comment
Обратите внимание, что сторонний загрузчик PUT на стороне клиента, упомянутый Dashron, требует, чтобы вы поместили свой токен доступа в сценарий на стороне клиента. Токены доступа — это конфиденциальная информация, как и пароли, поэтому их никогда не следует размещать на клиенте. Я попросил у Vimeo безопасный способ загрузки с помощью Ajax, их ответ здесь: vimeo.com/forums /api/topic:280469 - person Paul Looijmans; 23.02.2016
comment
@PaulLooijmans тема, на которую вы ссылались, исчезла. Не могли бы вы сообщить статус этого улучшения? - person Gaia; 10.01.2017
comment
@Dashron клиент, на который вы дали ссылку, устарел и больше не работает. Пожалуйста, предоставьте адекватный, рабочий пример! - person mimic; 08.05.2021
comment
Я больше не работаю в Vimeo и какое-то время не использовал их API. Тем не менее, лучший способ безопасно справиться с этим, когда я в последний раз работал с API, состоял в том, чтобы выполнить первый шаг на стороне сервера загрузки (для чего требуется токен доступа), а затем отправить URL-адрес загрузки клиенту (что не требует токен доступа). - person Dashron; 09.05.2021

Как упоминал @Dashron, для простых случаев следует использовать «Простую загрузку HTTP POST». Например, если вы хотите возобновить загрузку, вам следует использовать «Возобновляемую загрузку HTTP PUT».

Однако почти во всех ссылках на похожие проблемы отсутствуют две части информации, которыми я хотел бы поделиться.

1) Будьте осторожны при использовании vimeo-upload

Как упомянул @PaulLoomijmans в комментарии к @Dashron, загрузка vimeo (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#generate-an-upload-ticket), и вы можете использовать его, как если бы с «Возобновляемой загрузкой HTTP PUT», чтобы проверить ход загрузки.

Таким образом, даже при использовании «Простой загрузки HTTP POST» вы можете следить за информацией о «проверке загрузки» из «Возобновляемых загрузок HTTP PUT» (здесь: https://developer.vimeo.com/api/upload/videos#verify-the-upload). Вероятно, описанный там функционал возобновления не будет работать, но вы можете проверить ход загрузки и показать его пользователю во время загрузки. Я фактически реализовал это, чтобы показать индикатор выполнения в моем веб-приложении.

Я надеюсь, что это поможет кому-то, так как я переключался между двумя методами загрузки из-за ограничений/сложностей, которые влечет за собой каждый из них.

person Gonçalo    schedule 13.03.2017