Загрузка файла на box.com без записи в файловую систему

Я пытаюсь загрузить файл на Box.com, используя вызов REST API и гем httmultiparty. . Код работает и загружается на 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 %>

person Hani Atalla    schedule 22.12.2012    source источник
comment
Действие публикации на box.com должно выполняться из вашей формы.   -  person apneadiving    schedule 23.12.2012


Ответы (2)


Чтобы загрузить файл из памяти с помощью 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})
person raindrift    schedule 12.06.2013

Вы стремитесь к нестандартному шаблону использования, поэтому лучшим вариантом может быть расширение существующего драгоценного камня, чтобы обеспечить необходимую вам функциональность.

Существует гем ruby-box для использования со службой Box в версии 2.0 их API. Драгоценный камень хорошо поддерживается и довольно прост в использовании.

Вам нужно будет покопаться в исходном коде и создать новый метод загрузки.

person Paulo Fidalgo    schedule 28.05.2013