【问题标题】:406 Not Acceptable - xhr image upload to rails406 Not Acceptable - xhr 图像上传到 rails
【发布时间】:2011-08-16 16:30:19
【问题描述】:

我正在尝试将图像从 iPhone 上传到使用 Carrierwave 进行处理的工作 Rails 应用程序。我需要考虑 rails 需要的 CSRF 真实性令牌吗?

我的 Titanium app.js 文件中有以下内容,几乎取自他们的 Snappost 示例代码:

xhr.open('POST','http://myapp.com/foos/1/bars');
xhr.send({media:originalImage});

我的rails动作很简单:

def create
  @bar = @foo.bars.build(params[:bar])
  @bar.image = params[:file]    
  respond_to do |format|
    if @bar.save
      format.html { redirect_to(@foo, :notice => 'Bar was successfully created.') }
      format.json  { render :json => @bar, :status => :created }
      fotmat.xml { render :xml => @bar, :status => :created }
    else
      format.html { render :action => "new" }
      format.json { render :json => @bar.errors, :status => :unprocessable_entity }
      format.xml { render :xml => @bar.errors, :status => :unprocessable_entity }
    end
  end
end

在我尝试上传时,我收到了描述超时的“xhr.onerror”警报。我的服务器日志如下:

在 2011-05-01 17:01:33 -0500 为 ###.###.#.### 开始 POST "/foos/1/bars" 由 BarsController#create as MULTIPART_FORM 处理 参数:{"media"=#<:http::uploadedfile:0xabdd968 form-data name='\"媒体\";文件名=\"2' image>>, "foo_id"=>"1"} ^[[1m^[[36mSQL (1.9ms)^[[0m ^[[1mSHOW TABLES^[[0m ^[[1m^[[35mFoo Load (0.1ms)^[[0m SELECT foos.* FROM foos WHERE foos.id = 1 LIMIT 1 ^[[1m^[[36mSQL (2.6ms)^[[0m ^[[1mBEGIN^[[0m ^[[1m^[[35mSQL(5.9ms)^[[0m回滚 在 468 毫秒内完成 406 不可接受

【问题讨论】:

标签: ruby-on-rails-3 titanium appcelerator xmlhttprequest image-uploading


【解决方案1】:

您是对的,这是导致问题的真实性令牌(或缺少真实性令牌)。 How do I ignore the authenticity token for specific actions in Rails? 有更多关于如何忽略它的详细信息。更多详情http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html

【讨论】:

  • 我删除了 create 操作的真实性要求,我得到了一次性错误“EOFError (bad content body):”。从那以后,我不断地再次收到 406 错误。感谢 Roman 编辑我的日志。您现在可以在我的媒体参数中看到 ActionDispatch 输出。这可能是问题吗?
  • 您是如何取消真实性要求的。在控制器中使用 {skip_before_filter :verify_authenticity_token}?
  • "protect_from_forgery :except => [:create]" 在前置过滤器之后
  • 所以在关闭防伪保护后,您仍然会收到 406 错误吗?嗯。我不确定我的想法,我可能会写一个功能或集成测试来尝试复制问题,然后打开调试器并尝试在那里运行它。
  • 好的,这里有一点进展。我在 xhr.send() 中使用“媒体”参数时犯了一个愚蠢的错误。我将其更改为“文件”并包含我的模型所需的“名称”属性。现在 POST 已成功提交到我的数据库,但 rails 仍然返回 406 Not Acceptable。我在我的操作中添加了“fomat.js”,但这并没有帮助。我可能会回去尝试 json,因为我认识到了参数问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 2015-03-13
  • 2018-07-31
  • 2013-08-10
  • 2016-12-01
相关资源
最近更新 更多