2013-06-03 30 views
8

Im OK được ủy quyền.Tải video lên youtube từ trình duyệt

tôi có 2 nút như thế này trên trang của mình:

<input type="file" id="fileToSend"/> 
<input type="button" onclick="upload()" value="Upload" id="btnSend"/> 

tôi muốn tải lên các tập tin được lựa chọn để youtube khi tôi nhấp vào nút "Tải lên". Tôi đang gọi một chức năng như thế này:

function upload() { 
    var fileStream; 
    var video = document.getElementById("fileToSend"); 
    var file = video.files[0]; 
    console.log(file); 
    console.log("Nombre: " + file.name); 
    var r = new FileReader(); 
    r.onload = function() { 
     console.log("fileStream creado"); 
     fileStream = r.result; 
     //console.log("FileStream: " + fileStream); 
    }; 

    console.log("Creando fileStream.."); 
    r.readAsBinaryString(file); 


    gapi.client.load('youtube', 'v3', 
     function() { 
      var request = gapi.client.youtube.videos.insert({ 
       part: 'snippet, status', 
       resource: { 
        snippet: { 
         title: 'Video Test Title 5', 
         description: 'Video Test Description', 
         tags: ['Tag 1', 'Tag 2'], 
         categoryId: "22" 
        }, 
        status: { 
         privacyStatus: "private" 
        } 
       } 
      }, fileStream); 
      request.execute(function (response) { 
       console.log("executing.."); 
       var result = response.result; 
       console.log(response); 
       if (result) { 
        console.log("execute completed"); 
        document.write(result); 
       } 
      }); 
     }); 
} 

Vấn đề là tôi gặp lỗi trên đối tượng phản hồi "mediaBodyRequired", Nó giống như tôi không gửi fileStream chính xác.

+1

Bạn tìm thấy sự cố? Nếu có, hãy chia sẻ mã hoàn chỉnh của bạn vì đó chính xác là những gì tôi đang cố gắng làm. – offset

+0

Tôi gặp lỗi: "Tham chiếu không bắt buộcLỗi: gapi không được xác định." tại sao? – offset

+0

Tôi đã kết thúc bằng cách sử dụng API v2. Nếu tôi tìm thấy một giải pháp sử dụng v3 tôi sẽ đăng nó. –

Trả lời

3

Có lý do nào khiến bạn không thể sử dụng tiện ích tải lên YouTube không?
https://developers.google.com/youtube/youtube_upload_widget

Anyways, trực tiếp từ các tài liệu tham khảo API
https://developers.google.com/youtube/v3/docs/videos/insert

badRequest mediaBodyRequired The request does not include the video content. 

nguồn thông tin khác:
https://developers.google.com/api-client-library/javascript/samples/samples

+0

Kat, cảm ơn bạn đã trả lời. Tôi biết lỗi là do yêu cầu không bao gồm nội dung video, nhưng lý do là API không chỉ định cách thực hiện lệnh gọi API chèn bằng javascipt. Một ví dụ sẽ giải quyết tất cả các vấn đề của tôi. –

+0

Vâng, đây là ví dụ về việc tải danh sách phát ... xem xét nó có thể giúp bạn ... http://stackoverflow.com/a/12939702/996364 Tôi đang tìm một ví dụ 'chèn' nhưng tất cả tôi đã tìm thấy cho đến nay là một ví dụ java trong liên kết thứ hai trong câu trả lời của tôi và một ví dụ python https://developers.google.com/youtube/v3/guides/uploading_a_video sử dụng oauth –

+0

Có .. Tôi đã lấy cảm hứng từ mã của tôi trên các ví dụ đó nhưng vẫn không có may mắn cả .. Cảm ơn sự giúp đỡ của bạn. –

1

Có hai lựa chọn cho việc sử dụng v3 chèn. Yêu cầu phải một trong hai:

  1. có các tập tin phương tiện truyền thông như cơ thể mà ngăn cản việc gửi bất kỳ thông số POST khác, hoặc
  2. sử dụng mã hóa dưới dạng nhiều phần dữ liệu trong hai phần. Một phần là tệp để tải lên và phần khác là một blob JSON giống như tệp, bao gồm bất kỳ thông số nào bạn muốn gửi.

Tôi chưa bao giờ làm việc này bằng cách sử dụng client Javascript chính thức, nhưng đã viết lên một lời giải thích khá chi tiết về cách này có thể làm việc sử dụng XMLHttpRequest thường xuyên: http://lithostech.com/2013/10/upload-google-youtube-api-v3-cors/

Dưới đây là một ví dụ về phương pháp đầu tiên mà tập tin bản thân là toàn bộ yêu cầu nội dung:

// where videoFile is a http://www.w3.org/TR/FileAPI/#dfn-file 
var invocation = new XMLHttpRequest(); 
invocation.setRequestHeader('Authorization', 'Bearer ' + token); 
invocation.open('POST', "https://www.googleapis.com/upload/youtube/v3/videos?part=snippet", true); 
invocation.send(videoFile); 
+0

Stephen, bài đăng trên blog của bạn rất tuyệt, nhưng không hiển thị yêu cầu http cuối cùng ("Kết quả là tải lên thành công và yêu cầu trông rất giống với yêu cầu được tạo bởi đá quý ruby.") ... :( – l33t