当我在控制器方法结束时调用send_data
以导出Excel文件(使用Axlsx)时,如果使用POST调用控制器方法,则不会发生任何事情。如果使用GET调用相同的控制器方法,send_data
可以正常工作。在这两种情况下,Excel文件略有不同(POST发送的数据决定了数据在Excel中的显示方式),但我已经确认使用POST时excel_file
已正确设置。 使用Postman在外部调用POST端点时,会下载正确的Excel文件。但是,当单击浏览器中发出此POST请求的链接时,send_data
似乎什么都不做。控制器方法有两行代码:
excel_file = excel_util.export(params[:myPostParams]
send_data(excel_file.to_stream.read, type: "application/xlsx", filename: "MyExcelWorksheet.xlsx")
有关我的POST电话的更多信息:
我使用JQuery($ .post方法)从我的视图中的元素调用POST。就像我上面提到的,这似乎工作得很好,因为POST调用通过正确传递正确的信息,因为excel_file
是正确构建的。
使用POST在chrome的开发者工具中检查网络,创建“导出”操作和“结果”操作。 export
是处理POST和GET的控制器方法的名称。这是信息(仅包含相关信息,主机/来源/推荐人链接都很好)。
'导出'信息:
Request URL: http://localhost:3000/<myappname>/export
Request Method: POST
Response Headers:
Content-Disposition:attachment; filename="MyExcelWorksheet.xlsx"
Content-Length:7648
Content-Transfer-Encoding:binary
Content-Type:application/xlsx
X-Content-Type-Options:nosniff
X-Frame-Options:SAMEORIGIN
X-Miniprofiler-Ids:["i6c3..."]
Request Headers:
Accept:*/*
Accept-Encoding:gzip, deflate, br
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:1803
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With:XMLHttpRequest
Form Data:
<the data I send in the body of my POST>
'结果'信息:
Request URL: http://localhost:3000/mini-profiler-resources/results
Request Method: POST
Response Headers:
Content-Type:application/json
Request Headers:
Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip, deflate, br
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:64
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With:XMLHttpRequest
Form Data:
id: <i6c3... < same as the X-Miniprofiler-Id shown above >
popup: 1
rails是否存在问题,让POST请求在浏览器中响应附件下载?这在外部调用API时有效,但在浏览器中使用时则无效。
答案 0 :(得分:0)
这确实是使用Ajax进行POST调用的问题,不一定是send_data
的问题。这是一个很好的解决方法,用于在Javascript中进行POST调用并在Rails中处理调用:
https://gist.github.com/DavidMah/3533415
这对我有用,我希望这个很棒的链接可以获得更多的可见性。