ruby-on-rails - rails : get multipart/form-data POST request parameters with same name

标签 ruby-on-rails parsing parameters http-post

我无法影响其协议(protocol)的网站向我发送 POST 请求,其中包含多个具有相同名称“t”的参数。

这是我的request.raw_post:

--===13978193024621189109088990673===
Content-Disposition: form-data; name="t"
Content-Type: text/plain; charset=UTF-8

thevalue1
--===13978193024621189109088990673===
Content-Disposition: form-data; name="t"
Content-Type: text/plain; charset=UTF-8

thevalue2
--===13978193024621189109088990673===
Content-Disposition: form-data; name="t"
Content-Type: text/plain; charset=UTF-8

thevalue3
--===13978193024621189109088990673===
Content-Disposition: form-data; name="t"
Content-Type: text/plain; charset=UTF-8

thevalue4
--===13978193024621189109088990673===
Content-Disposition: form-data; name="t"
Content-Type: text/plain; charset=UTF-8

thevalue5
--===13978193024621189109088990673===
Content-Disposition: form-data; name="t"
Content-Type: text/plain; charset=UTF-8

thevalue6

标准 params 集合仅列出最后一个参数。

如何获取所有的值?

重现此请求的方法是:

<form action="/updateinfo" method="post" enctype="multipart/form-data">
  <input type="text" name="t" value="thevalue1"><br>
  <input type="text" name="t" value="thevalue2"><br>
  <input type="text" name="t" value="thevalue3"><br>
  <input type="text" name="t" value="thevalue4"><br>
  <input type="text" name="t" value="thevalue5"><br>
  <input type="text" name="t" value="thevalue6"><br>
  <input type="submit">
</form>

最佳答案

最后我找到并使用了multipart-parser gem .它缺少文档,所以这是我使用的代码:

require 'multipart_parser/reader'

module MultiParams
  def parse_multi_params(request)
    parts={}

    reader = MultipartParser::Reader.new(MultipartParser::Reader::extract_boundary_value(request.headers['CONTENT_TYPE']))

    reader.on_part do |part|
      pn = part.name.to_sym
      part.on_data do |partial_data|
        if parts[pn].nil?
          parts[pn] = partial_data
        else
          parts[pn] = [parts[pn]] unless parts[pn].kind_of?(Array)
          parts[pn] << partial_data
        end
      end
    end

    reader.write request.raw_post
    reader.ended? or raise Exception, 'truncated multipart message'

    parts
  end
end

在 Controller 中的用法:

require 'multi_params'

class MyController < ApplicationController
  include MultiParams

  def my_method
    mp = parse_multi_params(request)
    process_params(mp[:t])
  end
end

关于ruby-on-rails - rails : get multipart/form-data POST request parameters with same name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23153099/

相关文章:

ruby-on-rails - Ruby on Rails 和安全

ruby-on-rails - 如何将参数从 View 传递到 Controller 并将其保存到变量中?

python - 从 SVN 日志中过滤 <msg> 以仅获取票号

postgresql - Reporting Services - 连接字符串和参数

javascript - ASP.NET 将 gridview 单元格值传递给 javascript

ruby-on-rails - Rails Cucumber 测试 - 将表单数据发送到方法

ruby-on-rails - rails : update_attributes does not update any other existing instances referring to the same model instance

java - 从 Java 源代码中分离字符串

javascript - React 共享组件/缓存

excel - 将 DB 连接参数传递到 Kettle(又名 PDI 表)从 Excel 动态输入步骤