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.
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? –
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. –