2012-12-22 80 views
2

我想通過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調用需要一個「文件」類型的對象。任何幫助表示讚賞。謝謝。文件上傳到box.com而不寫入文件系統

模型和視圖代碼:

### 
#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 %> 
+0

對box.com的發佈操作應該從您的表單中完成。 – apneadiving

回答

1

你的目標是一個非常使用的模式,所以你最好的拍攝可能會延長existant寶石,爲您提供所需要的功能。

有一個gem ruby-box用於2.0版API的Box服務。 該寶石是很好的支持,很容易使用。

你需要挖掘源代碼並創建一個新的上傳方法。

1

要使用HTTMultiParty從存儲器上傳文件,您需要爲其提供一個UploadIO對象來代替通常爲其提供的File對象。 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})