首页 文章

如何从Rails 5应用程序上传视频(可能)到Vimeo?

提问于
浏览
0

我正在尝试使用Vimeo API和“Resumable HTTP PUT uploads”选项从我的RoR 5应用程序将视频上传到我的Vimeo帐户:

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

为此,我使用Paperclip将视频上传到我的应用程序,然后我想做一个多部分PUT请求,以API文档指定的方式发送带有 Content-LengthContent-Type 标头的文件,但我不知道如何通过PUT请求发送视频文件,有什么帮助吗?

提前致谢 .

1 回答

  • 0

    视频上传是一项长期任务 . 最好在单独的进程中运行长任务 . 为此,您可以使用ActiveJobDelayed Job作为后端 . 延迟作业与现有数据库一起使用,不需要单独的Redis服务器 .

    上传视频后保存Vimeo上传作业(保存模型) . 使用视频ID作为作业参数 . 我还假设Paperclip属性名称是 video .

    class Video < ApplicationRecord
    
      has_attached_file :video
    
      after_commit :upload_to_vimeo
    
      def upload_to_vimeo
        VimeoUploadJob.perform_later(id)
      end
    
    end
    

    上载作业应使用HTTP客户端来使用Vimeo API . 您可以使用标准库中的Net::HTTP . 以下是其用法示例 . It is incomplete 仅供参考 .

    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
    

    我希望这能解释如何使用API . 您可以改进此示例,直到它适合您 .

相关问题