我如何在 Ruby 2.5 中解码或解析"multipart/form-data"并使用参数获取哈希



我想解码正文,我应该得到什么 apigateway 请求到 ruby 2.5 中的 lambda 并使用参数获取哈希。 这个带有"内容类型:"表单数据"

----------------------------106174163609970174188191\r内容处置:表单数据; name=\"packageName\"\r\rcom.orbemnetworks.americatv\r----------------------------106174163609970174188191\rContent-Disposition: form-data; name=\"subscriptionId\"\r\r\rsuscripcion_mensual\r----------------------------106174163609970174188191\rContent-Disposition: form-data; name=\"token\"\r\rdaomloifokamoigolhhapeap.AO-J1OxQBm7mW7z6pPPfwE9bJ23n5oeQwOBf46gKFSjjdHmkRHJDIR-RCbXtuDD6L_C_KfYEVETbvpu0M72t9-FXTNdHbB67dfJqzGMpx197Pb_IN8kLyU6ng-b8Yvo-1r-xJzcC04Rg\r----------------------------106174163609970174188191\rContent-Disposition: form-data; name=\"idusuario\"\r\r1577633\r----------------------------106174163609970174188191\rContent-Disposition: form-data; name=\"os\"\r\rA\r----------------------------106174163609970174188191--\r

我的代码受到启发(阅读:大部分复制自(Faraday Gem 在: Faraday Gem Github

您将需要使用gem 'multipart-parser', '~> 0.1.1'和 创建util.rb文件:

require 'multipart_parser/reader'
module Util
extend self
# parse a multipart MIME message, returning a hash of any multipart errors
def parse_multipart(event)
body = event["body"]
boundary = MultipartParser::Reader::extract_boundary_value(event.dig("headers","Content-Type"))
reader = MultipartParser::Reader.new(boundary)
result = { errors: [], parts: [] }
def result.part(name)
hash = self[:parts].detect { |h| h[:part].name == name }
[hash[:part], hash[:body].join]
end
reader.on_part do |part|
result[:parts] << thispart = {
part: part,
body: []
}
part.on_data do |chunk|
thispart[:body] << chunk
end
end
reader.on_error do |msg|
result[:errors] << msg
end
reader.write(body)
result
end
def parse_multipart_hash(event)
event_parts = parse_multipart(event)[:parts]
event_parts.inject({}) do |hash, part|
if part[:part].filename.nil?
hash.merge({part[:part].name => part[:body]})
else
hash.merge({part[:part].name => {mime: part[:part].mime, filename: part[:part].filename, data: part[:body].join}})
end
end
end
end

然后你可以像这样使用它:

require_relative './util'
def lambda_handler(event:, context:)
parsed_event_body = Util.parse_multipart_hash(event)
end

不确定这将如何处理图像,但它适用于CSV。您可以修改parse_multipart以仅返回哈希,但我保留了它,因为它似乎为数据提供了更通用的结构。

您可以使用第一种方法,如下所示:

parts = Util.parse_multipart_hash(event)
meta, fieldname = parts.part("fieldname")

Rack的多部分解析器可以解析多部分表单数据

require "rack"
content_type = "multipart/form-data; boundary=xYzZY"
sanitized_multipart_form_data = multipart_form_data.gsub(/r?n/, "rn")
io = StringIO.new(sanitized_multipart_form_data)
tempfile = Rack::Multipart::Parser::TEMPFILE_FACTORY
bufsize = Rack::Multipart::Parser::BUFSIZE
query_parser = Rack::Utils.default_query_parser
result = Rack::Multipart::Parser.parse(io, sanitized_multipart_form_data.length, content_type, tempfile, bufsize, query_parser)
params = result.params

如果有帮助,我已经将上面的代码片段作为红宝石发布

https://rubygems.org/gems/multipart_form_data_parserhttps://github.com/nisanth074/multipart_form_data_parser

相关内容

  • 没有找到相关文章

最新更新