3

API REST 呼び出しと httmultiparty gemを使用して、Box.com にファイルをアップロードしようとしています。コードは機能しており、Box.com にアップロードしますが、アップロードされたファイルを f.write(data.read) のようにサーバー ファイル システムに書き込んでから、書き込まれたファイルのファイル パスを Box への入力パラメータとしてキャプチャします。 com API REST 呼び出しは、:filename => File.new(path) のようになります。アプリは Heroku で実行されるため、Heroku のサーバーにファイル (読み取り専用) を保存することはできません。サーバーへのファイルの書き込みをバイパスしながら、ファイルを Box.com に直接アップロードしたいのですが、できません。 Box.com REST 呼び出しには「ファイル」タイプのオブジェクトが必要であることを考慮してください。どんな助けでも大歓迎です。ありがとう。

モデルとビューのコードは次のとおりです。

### 
#The Model
###
    class BoxUploader 
      require 'httmultiparty'
      include HTTMultiParty
      #base_uri 'https://api.box.com/2.0'
    end

    class File < ActiveRecord::Base
        attr_accessible :file
        attr_accessor :boxResponse

        FILE_STORE = File.join Rails.root, 'public', 'files'
        API_KEY = @myBoxApiKey
        AUTH_TOKEN = @myBoxAuthToken

        def file=(data) #uploaded file 
          filename = data.original_filename 
          path = File.join FILE_STORE, filename
          #### would like to bypass the file writing step
          File.open(path, "wb")  do |f| 
            f.write(data.read) 
          end
          #############
          File.open(path, "wb")  do |f| 
           boxResponse = BoxUploader.post('https://api.box.com/2.0/files/content', 
                :headers => { 'authorization' => 'BoxAuth api_key={API_KEY&auth_token=AUTH_TOKEN' },
                :body => { :folder_id      => '911', :filename => File.new(path)}
            )
          end  
    end

###
# The View
###
<!-- Invoke the Controller's "create" action -->
<h1>File Upload</h1>
<%= form_for @file, :html => {:multipart=>true} do |f| %>
  <p>
    <%= f.label :file %>
    <%= f.file_field :file %>
  </p>
  <p>
    <%= f.submit 'Create' %>
<% end %>
4

2 に答える 2

1

HTTMultiParty を使用してメモリからファイルをアップロードするには、通常は File オブジェクトの代わりに UploadIO オブジェクトを指定する必要があります。UploadIO オブジェクトは、StringIO を使用して設定できます。HTTMultiParty は UploadIO オブジェクトを特別な方法で処理しているように見えるため、StringIO を直接使用することはできません。

class Uploader
  include HTTMultiParty
  base_uri "http://foo.com"
end

string_io = StringIO.new('some stuff that pretends to be in a file')
upload_io = UploadIO.new(string_io, 'text/plain', 'bar.txt')
Uploader.post("/some/path", query: {file: upload_io})
于 2013-06-12T06:27:51.657 に答える
0

非一般的な使用パターンを目指しているため、必要な機能を提供するために、既存の宝石を拡張することが最善の方法です。

API のバージョン 2.0 の Box サービスで使用するgem ruby​​-boxがあります。この宝石は十分にサポートされており、非常に使いやすいです。

ソース コードを掘り下げて、新しいアップロード メソッドを作成する必要があります。

于 2013-05-28T13:25:14.880 に答える