在我们的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
答案 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