【问题标题】:How to upload videos (resumably) to Vimeo from a Rails 5 app?如何从 Rails 5 应用程序将视频(可恢复)上传到 Vimeo?
【发布时间】:2016-07-31 09:22:40
【问题描述】:

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

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

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

提前致谢。

【问题讨论】:

    标签: ruby-on-rails paperclip vimeo-api


    【解决方案1】:

    视频上传是一项漫长的任务。最好在单独的进程中运行长任务。为此,您可以使用 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。这是它的用法示例。 不完整,仅供说明之用。

    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。您可以改进此示例,直到它适合您为止。

    【讨论】:

    • 非常感谢您的回复!我正在尝试执行您的代码,直到验证上传,但我收到“{“错误”:“找不到请求的页面”}”响应 (404)。你知道为什么会这样吗?
    • 没有。你需要自己去理解。您可以puts 任何您需要查看的值。您可以使用curl 程序从终端发出测试请求。当我们使用任何 API 时,我们都会这样做。我们探索它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2014-08-29
    • 1970-01-01
    • 2020-06-05
    • 2016-07-27
    • 1970-01-01
    相关资源
    最近更新 更多