通过JSON API通过HTTP发布文件附件

时间:2009-09-17 19:58:06

标签: ruby-on-rails ruby json libcurl

我有一个名为Book的模型,其中has_many:照片(文件附件由回形针处理)。

我正在构建一个客户端,它将通过JSON与我的Rails应用程序通信,使用Paul Dix的Typhoeus gem,它使用libcurl。

发布一个新的Book对象很简单。要创建标题为“Hello There”的新书记录,我可以做一些简单的事情:

require 'rubygems'
require 'json'
require 'typhoeus'

class Remote
  include Typhoeus
end

p Remote.post("http://localhost:3000/books.json",
  { :params =>
    { :book => { :title => "Hello There" }}})

当我尝试将照片添加到此查询时,我的问题就开始了。只需通过HTML表单发布文件附件即可创建如下查询:

 Parameters: {"commit"=>"Submit", "action"=>"create", "controller"=>"books", "book"=>{"title"=>"Hello There", "photo_attributes"=>[{"image"=>#<File:/var/folders/1V/1V8Kw+LEHUCKonqJ-dp3oE+++TI/-Tmp-/RackMultipart20090917-3026-i6d6b9-0>}]}}

所以我的假设是我想在Remote.post调用中重新创建相同的查询。

我在想,我正在让哈希中哈希数组的语法得到最好的解释。我一直在尝试做我期望的工作的变化,这将是:

p Remote.post("http://localhost:3000/books.json", 
  { :params => 
    { :book => { :title => "Hello There",
                 :photo_attributes => [{ :image => "/path/to/image/here" }] }}})

但这似乎连接成一个字符串,我正在尝试将其变成一个哈希,并返回(无论我在:image =&gt;“”哈希)中做什么:

NoMethodError (undefined method `stringify_keys!' for "image/path/to/image/here":String):

但是我也不想浪费太多时间来弄清楚我的语法有什么问题,如果不管怎么说都不行,所以我想我会来这里。

我的问题是: 我是否在正确的轨道上?如果我清除此语法以发布哈希数组而不是奇怪的连接字符串,那么这应该足以将图像传递给Book对象吗?

或者我是否接近这个错误?

1 个答案:

答案 0 :(得分:1)

实际上,你不能在xhr上发布文件,javascript中的安全预防措施会阻止它处理任何文件。解决这个问题的诀窍是将文件发布到隐藏的iframe,并且iframe会定期发布到服务器,从而避免整个页面刷新。这个技术在几个地方都有详细介绍,可能会尝试这个(他们使用的是php,但原理保持不变,并且有一个冗长的讨论很有帮助):

Posting files to a hidden iframe