rails send_data 使用 POST 发送 Excel 文件时不发送任何内容

rails send_data does not send anything when using POST to send Excel file

当我在控制器方法的末尾调用 send_data 以导出 Excel 文件(使用 Axlsx)时,如果使用 POST 调用控制器方法,则没有任何反应。如果使用 GET 调用相同的控制器方法,send_data 工作得很好。在这两种情况下,Excel 文件略有不同(POST 发送的数据决定了数据在 Excel 中的显示方式),但我已验证 excel_file 已设置使用 POST 时正确启动。 使用 Postman 从外部调用 POST 端点时,会下载正确的 Excel 文件。然而,当在浏览器中点击发出这个POST请求的link时,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 是正确构建的。

在 chrome 的开发人员工具中检查网络,使用 POST 创建一个 'export' 操作和一个 'results' 操作。 export 是处理 POST 和 GET 的控制器方法的名称。这是信息(只包括相关信息,host/origin/referrer link都可以)。

'export' 信息:

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>

'results' 信息:

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 时有效,但在浏览器中使用时无效。

这确实是使用 Ajax 进行 POST 调用的问题,不一定是使用 send_data 的问题。这是在 Javascript 中进行 POST 调用并在 Rails 中处理调用的一个很好的解决方法:

https://gist.github.com/DavidMah/3533415

这对我有用,我希望这个很棒的 link 得到更多的关注。