Издание на 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 има 100% поддръжка за CORS.

Дълъг отговор:

Vimeo POST качванията са разработени, за да осигурят невероятно лесно изживяване при качване. Ние ви даваме формуляр. Поставяте формуляра в html на вашата страница, потребителят използва формуляра и всичко е настроено. Това не поддържа ленти за напредък. Това не подлежи на възобновяване.

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

Точно сега трябва да завършите качването сами. Работим върху подобряването на това, но за момента трябва да намерите URL адреса в заглавката „местоположение“ на отговора от вашия POST. Направете GET заявка до този url и вашето качване ще бъде завършено.

Vimeo PUT качванията са проектирани като напълно функционална усъвършенствана система за качване. Те могат да се възобновят, стрийминг дизайнът лесно поддържа ленти за напредък. Можете да попитате за състоянието на качването и да стартирате и спрете всичко по команда. CORS се поддържа на 100%. Това ще изисква използването на файловия обект HTML5, който има ограничена поддръжка за ie 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 и се използва в много уебсайтове. Работи успешно с корс! - 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, „Simple HTTP POST uploading“ трябва да се използва за прости случаи. Например, ако искате да възобновите качване, трябва да използвате „Resumable HTTP PUT uploads“.

Въпреки това липсват две части от информацията в почти всички препратки към подобни проблеми, които бих искал да споделя.

1) Бъдете внимателни, когато използвате vimeo-upload

Както @PaulLoomijmans спомена в коментар към @Dashron, качването на vimeo (github.com/websemantics/vimeo-upload) изисква да разкриете токена си, което не е добре от съображения за сигурност.

Всъщност току-що оставих предложение в хранилището, че все пак би било много полезно, ако можем да го използваме с upload_url от vimeo, тъй като тогава няма да се налага да излагаме нашия токен.

2) Можете да проверите напредъка на качването чрез метода за качване POST

Ако като мен просто искате да можете да докладвате на потребителя напредъка на качването, докато използвате опростения процес на качване на „Simple HTTP POST качване“, всъщност можете да го направите без метода PUT.

Въпреки че не е ясно документиран, когато използвате „Simple HTTP POST качване“, вие също имате „upload_link_secure“ в първоначалния отговор (https://developer.vimeo.com/api/upload/videos#generate-an-upload-ticket) и можете да използвате това, както бихте направили с „Resumable HTTP PUT uploads“, за да проверите напредъка на вашето качване.

Като такъв, дори когато използвате „Опростено HTTP POST качване“, можете да следвате информацията за „проверка на качването“ от „Възобновяеми HTTP PUT качвания“ (тук: https://developer.vimeo.com/api/upload/videos#verify-the-upload). Вероятно описаната там функция за възобновяване няма да работи, но можете да проверите напредъка на качването и да го покажете на потребителя, докато качването се извършва. Всъщност го внедрих, за да покажа лента за напредък в моето уеб приложение.

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

person Gonçalo    schedule 13.03.2017