Hani Atalla
Hani Atalla

Reputation: 31

File upload to box.com without writing to file system

I am trying to upload a file to Box.com using its API REST call and the httmultiparty gem. The code is working and uploads to Box.com but does that after writing the uploaded file to the server file system as in f.write(data.read) then capturing the file path for the written file as the input parameter to the Box.com API REST call as in :filename => File.new(path). The app will be running on Heroku, so we can't save any files (read only) on Heroku's server so I would like to directly upload the file to Box.com while bypassing the writing of the file on the server but can't figure that out given that the Box.com REST call requires an object of type "File". Any help is appreciated. Thanks.

The model and view code is:

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

Upvotes: 3

Views: 1323

Answers (2)

raindrift
raindrift

Reputation: 157

To upload a file from memory with HTTMultiParty, you need to supply it with an UploadIO object in place of the File object you'd normally give it. The UploadIO object can be populated using StringIO. It seems HTTMultiParty handles UploadIO objects in a special way, so you can't use the StringIO directly:

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})

Upvotes: 1

Paulo Fidalgo
Paulo Fidalgo

Reputation: 22296

You are aiming at a non-common use pattern, so your best shot could be to extend the existant gem, to provide the functionality you need.

There is a gem ruby-box to use with Box service at the 2.0 version of their API. The gem is well supported and pretty easy to use.

You'll need to dig on the source code and create a new upload method.

Upvotes: 0

Related Questions