如何防止Rails处理大型XML帖子

时间:2010-10-02 04:13:25

标签: ruby-on-rails xml

在我们的rails应用程序中,我们有许多操作可以执行常规的webapp操作。但是,我们有一个接受大型XML文件的操作。我想保持将XML解析为params。相反,我希望能够获取URL参数(/ documents / {id} / action),然后将xml文件写出到特定目录。如何防止Rails处理它?<​​/ p>

我如何定义处理此操作的动作?

def handle_xml
   # what to put here
end

使用Content-Type完成上传:application / xml它是一个文件,而不是多部分表单的一部分。示例curl语句将是:

curl-H 'Accept: application/xml' -H 'Content-Type: application/xml' -X POST -d '<?xml version="1.0" encoding="UTF-8"?><test></test>' http://0.0.0.0:3000/controller/handle_xml

4 个答案:

答案 0 :(得分:5)

如果您想阻止rails自动将XML数据解析为参数哈希,您必须使用自己的自定义版本替换ParamsParser中间件。

当文件发布到rails时,ParamsParser中间件会修改请求参数,如果数据格式为xml,则将其转换为Hash。您可以在导轨中的params_parser.rb文件中找到详细信息。

这是RoR mailing list message类似于您提出的问题

不幸的是,作为一个新用户,我无法发布更多链接,但您应该搜索谷歌“使用自定义机架中间件清理POST参数”,以获取有关编写自定义机架中间件的更多详细信息。

答案 1 :(得分:1)

我最近也遇到过这个问题。然而,我的内部应用程序可以完全控制Rails应用程序和连接它的客户端。

在我的应用程序中,客户端将大型XML数据集POST到Rails应用程序。我想在延迟的作业(resque)中处理XML文档。我的解决方法是让客户端使用备用内容类型。我使用了 application / octet-stream 。这可以防止Rails解析POST数据。数据在request.raw_post

中提供

答案 2 :(得分:0)

操作应该将其作为文件接收(通过多部分表单上传),然后将其作为临时文件存储。

答案 3 :(得分:0)

您是否尝试过发送xml文件在http uri请求中有一个变量?像

这样的东西
@xml_file = xml..xml...xml...

parameters => {
  query => {
    xml_file => @xml_file
  }
}
Httparty.post("url", parameters)

然后在你的方法中:

def handle_xml
  @xml_file = params[:xml_file]
  @xml_file.save (or whatever you want here..)
end