0

我已经与这个问题斗争了 2 天,但无法克服以下步骤。

我正在尝试使用 Wistia API 上传视频,但在将文件名和数据从视图传递到控制器的那一刻卡住了。

我正在使用官方http://wistia.com/doc/upload-api#examples_using_ruby API 文档,但不断收到“没有将符号隐式转换为字符串”错误。

我真的很感激任何帮助或提示。

我的观点 index.html.erb:

<h1>File Upload</h1>
<%= form_tag('/uploads', method: :post, multipart: true) do %>

<%= file_field 'pic', 'data' %></p>
<%= submit_tag "Upload" %>
<%= debug params %>
<% end %>

我的控制器上传控制器:

class UploadsController < ApplicationController
  def home
  end

  def uploadFile
  end

  def create
    @xyz = post_video_to_wistia(:pic, :data)
  end


  require 'net/http'
  require 'net/http/post/multipart'

    def post_video_to_wistia(name, path_to_video)
  uri = URI('https://upload.wistia.com/')

  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true

  # Construct the request.
  request = Net::HTTP::Post::Multipart.new uri.request_uri, {
    'api_password' => '<API_PASSWORD>',
    'contact_id'   => '<CONTACT_ID>', # Optional.
    'project_id'   => '<PROJECT_ID>', # Optional.
    'name'         => '<MEDIA_NAME>', # Optional.

    'file' => UploadIO.new(
                File.open(path_to_video),
                'application/octet-stream',
                File.basename(path_to_video)
              )
  }

  # Make it so!
  response = http.request(request)

  return response
end

end

参数:

{"utf8"=>"✓",
 "authenticity_token"=>"/dRprM7ZjQzzb9N9OErk0Dy4tSt/+zsUldpOed8jCqY=",
 "pic"=>{"data"=>#<ActionDispatch::Http::UploadedFile:0x3ef23e0 @tempfile=#<Tempfile:C:/Users/Maciek/AppData/Local/Temp/RackMultipart20140527-7076-bo3tzy>,
 @original_filename="example.jpg",
 @content_type="image/jpeg",
 @headers="Content-Disposition: form-data; name=\"pic[data]\"; filename=\"example.jpg\"\r\nContent-Type: image/jpeg\r\n">},
 "commit"=>"Upload"}
4

1 回答 1

0

更新create操作如下:

def create
  @xyz = post_video_to_wistia(:pic, params[:pic][:data]) ## Notice params[:pic][:data]
end

笔记:

params[:pic][:data]包含path_to_video通过表单输入和提交的内容。

目前,您正在post_video_to_wistia使用第二个参数作为:data(这是一个符号)调用方法,即,您在调用的方法中接收参数path_to_video = :data

您必须在线收到错误

'file' => UploadIO.new(
            File.open(path_to_video), ## <== Problem here
            'application/octet-stream',
            File.basename(path_to_video)
          )

因为,不是传递视频的实际路径,而是传递了一个导致 错误的符号File.open(path_to_video)

no implicit conversion of Symbol into String

Ruby 无法转换:datapath_to_video(例如:/path/to/myvideo)。

如上所述,您需要将params[:pic][:data]第二个参数作为post_video_to_wistia方法传递给您的代码才能工作。

更新:

对于评论中的错误

我遵循了您的指导,但现在得到“没有将 ActionDispatch::Http::UploadedFile 隐式转换为字符串”

您需要做的是,更新以下代码

'file' => UploadIO.new(
            File.open(path_to_video),
            'application/octet-stream',
            File.basename(path_to_video)
          )

'file' => UploadIO.new(
            path_to_video.tempfile,  ## <== Changed this
            'application/octet-stream',
            path_to_video.original_filename ## <== Changed this
          )

此更改是由于您已经收到了一个文件path_to_video(这是ActionDispatch::Http::UploadedFile类的一个实例),您可以通过访问该文件 path_to_video.tempfile并通过以下方式获取上传的文件名path_to_video.original_filename

于 2014-05-27T17:16:49.343 回答