Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 文件上载到box.com而不写入文件系统_Ruby On Rails_Box Api - Fatal编程技术网

Ruby on rails 文件上载到box.com而不写入文件系统

Ruby on rails 文件上载到box.com而不写入文件系统,ruby-on-rails,box-api,Ruby On Rails,Box Api,我正在尝试使用其REST调用和httmultipparty gem将文件上载到Box.com。代码正在工作并上载到Box.com,但在将上载的文件写入服务器文件系统(如f.write(data.read))后,会执行此操作,然后捕获已写入文件的文件路径作为Box.com API REST调用的输入参数,如:filename=>file.new(path)。该应用程序将在Heroku上运行,因此我们无法在Heroku的服务器上保存任何文件(只读),因此我想直接将文件上载到Box.com,同时绕过在

我正在尝试使用其REST调用和httmultipparty gem将文件上载到Box.com。代码正在工作并上载到Box.com,但在将上载的文件写入服务器文件系统(如f.write(data.read))后,会执行此操作,然后捕获已写入文件的文件路径作为Box.com API REST调用的输入参数,如:filename=>file.new(path)。该应用程序将在Heroku上运行,因此我们无法在Heroku的服务器上保存任何文件(只读),因此我想直接将文件上载到Box.com,同时绕过在服务器上写入文件的过程,但鉴于Box.com REST调用需要“file”类型的对象,因此无法确定这一点。感谢您的帮助。谢谢

模型和视图代码为:

### 
#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 %>
###
#模型
###
类BoxUploader
需要“httmultipparty”
包括httmultipparty
#基_uri'https://api.box.com/2.0'
结束
类文件{'authorization'=>'BoxAuth api_key={api_key&auth_token=auth_token'},
:body=>{:folder_id=>'911',:filename=>File.new(path)}
)
结束
结束
###
#景色
###
文件上传
{:multipart=>true}do | f |%>


您的目标是一种非常用模式,因此最好的办法是扩展现有的gem,以提供您需要的功能

在2.0版本的API中,有一个与Box服务一起使用的gem。 gem得到了很好的支持,并且非常容易使用


您需要深入研究源代码并创建一个新的上载方法。

要使用httmultipparty从内存上载文件,您需要为其提供一个UploadIO对象来代替通常提供的file对象。UploadIO对象可以使用StringIO填充。httmultipparty似乎以一种特殊的方式处理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})

到box.com的post操作应根据您的表单进行。