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である)として 2 番目の引数を使用してメソッドを呼び出しています。つまり、呼び出されたメソッドでパラメーターを受け取ります。:datapath_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 は (例: /path/to/myvideo) に変換できませ:datapath_to_video

上記のように、コードを機能させるには、メソッドにparams[:pic][:data]2 番目の引数として渡す必要があります。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 に答える