2016-07-31 14 views
0

Ich versuche, Videos auf meinen Vimeo-Account von meiner RoR 5-Anwendung mit der Vimeo API und der Option „Wiederaufnehmbare HTTP PUT uploads“ laden:Wie kann ich Videos (vermutlich) von einer Rails 5 App auf Vimeo hochladen?

https://developer.vimeo.com/api/upload/videos#resumable-http-put-uploads

Dafür ich bin mit der Büroklammer hochladen Video zu meiner Anwendung und dann möchte ich eine mehrteilige PUT Anfrage zu senden die Datei mit den Content-Length und Content-Type Header wie die API-Dokumentation spezifiziert, aber ich habe keine Ahnung, wie die Videodatei über PUT Anfrage, jede Hilfe zu senden ?

Vielen Dank im Voraus.

Antwort

0

Video-Upload ist eine lange Aufgabe. Es ist besser, lange Aufgaben in einem separaten Prozess auszuführen. Dafür können Sie ActiveJob mit Delayed Job als Backend verwenden. Verzögerter Job arbeitet mit der vorhandenen Datenbank und benötigt keinen separaten Redis-Server.

Fügen Sie einen Vimeo-Upload-Auftrag in die Warteschlange ein, nachdem das Video hochgeladen wurde (das Modell wird gespeichert). Verwenden Sie die Video-ID als Job-Parameter. Ich nehme auch an, dass der Name des Paperclip-Attributs video lautet.

class Video < ApplicationRecord 

    has_attached_file :video 

    after_commit :upload_to_vimeo 

    def upload_to_vimeo 
    VimeoUploadJob.perform_later(id) 
    end 

end 

Der Upload-Auftrag sollte einen HTTP-Client verwenden, um mit Vimeo API zu arbeiten. Sie können Net::HTTP aus der Standardbibliothek verwenden. Hier ist ein Beispiel für seine Verwendung. Es ist unvollständig und nur zu Illustrationszwecken zur Verfügung gestellt.

class VimeoUploadJob < ApplicationJob 
    queue_as :uploads 

    def perform(video_id) 
    video = Video.find(video_id) 

    http = Net::HTTP.new('api.vimeo.com', 443) 
    http.use_ssl = true 
    http.start do |session| 

     # Generate an upload ticket 
     request = Net::HTTP::Post.new('/me/videos') 
     request.form_data = {'type' => 'streaming'} 
     response = session.request(request) 
     ticket = OpenStruct.new(JSON.parse(response.body)) 

     # Upload your video 
     request = Net::HTTP::Put.new(ticket.upload_link_secure) 
     request.content_type = video.video_content_type 
     request.content_length = video.video_file_size 
     request.body_stream = File.open(video.video.path) 
     response = session.request(request) 
     if response.code == 501 
     # error 
     end 

     # Verify the upload 
     request = Net::HTTP::Put.new(ticket.upload_link_secure) 
     request.add_field('Content-Range', 'bytes */*') 
     response = session.request(request) 
     if response.code == 308 
     range = response.range 
     end 

     # Complete the upload 
     request = Net::HTTP::Delete.new(ticket.complete_uri) 
     response = session.request(request) 
     video_uri = response['Location'] 

    end 
    end 
end 

Ich hoffe, dass dies erklärt, wie man mit der API arbeitet. Sie können dieses Beispiel verbessern, bis es für Sie funktioniert.

+0

Vielen Dank für Ihre Antwort !. Ich versuche, Ihren Code auszuführen, bis der Upload überprüft wird, aber ich bekomme einen "{" Fehler ":" Die angeforderte Seite konnte nicht gefunden werden "}" Antwort (404). Weißt du, warum das passiert? –

+0

Nein. Sie müssen es selbst verstehen. Sie können alle Werte anzeigen, die Sie sehen müssen. Sie können das Programm 'curl' verwenden, um vom Terminal Testanforderungen zu stellen. Das machen wir alle, wenn wir mit einer API arbeiten. Wir erforschen es. –