我正在尝试使用其API REST调用和httmultiparty gem将文件上传到Box.com。代码正在工作并上传到Box.com,但是在将上传的文件写入服务器文件系统之后,如f.write(data.read),然后捕获写入文件的文件路径作为Box的输入参数。 com API REST调用,如:filename => File.new(路径)。该应用程序将在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 %>
答案 0 :(得分:1)
您的目标是非常见的使用模式,因此您最好的方法是扩展现有的宝石,以提供您所需的功能。
在API的2.0版本中,有一个gem ruby-box与Box服务一起使用。 宝石得到很好的支持,非常容易使用。
您需要挖掘源代码并创建新的上传方法。
答案 1 :(得分:1)
要使用HTTMultiParty从内存中上传文件,您需要为其提供一个UploadIO对象来代替您通常提供的File对象。可以使用StringIO填充UploadIO对象。似乎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})