Ruby on rails 如何允许使用grapeapi下载二进制文件
我想允许使用ruby的GrapeAPI下载二进制文件(.p12文件)。这就是我正在尝试的Ruby on rails 如何允许使用grapeapi下载二进制文件,ruby-on-rails,ruby,api,actioncontroller,grape-api,Ruby On Rails,Ruby,Api,Actioncontroller,Grape Api,我想允许使用ruby的GrapeAPI下载二进制文件(.p12文件)。这就是我正在尝试的 get '/download_file' do pkcs12 = generate_pkcsfile content_type('application/octet-stream') body(pkcs12.der) end 使用ActionController的等效代码是 begin pkcs12 = generate_pkcsfile send_data(pkcs12.der,
get '/download_file' do
pkcs12 = generate_pkcsfile
content_type('application/octet-stream')
body(pkcs12.der)
end
使用ActionController的等效代码是
begin
pkcs12 = generate_pkcsfile
send_data(pkcs12.der,
:filename => 'filename.p12')
end
问题是,使用API下载的文件似乎是一个文本文件,每个字符都嵌入了“\ufffd”前缀,而使用浏览器下载的文件似乎是二进制文件。我如何使用GRAPE API框架来下载通过ActionController的send_data下载的同一文件?我认为您的GRAPE代码还可以,我已经使用浏览器和用于测试API的Mac HTTP工具(称为GraphicalHTTPClient)测试了它的一个变体。我成功地从磁盘加载了一个二进制文件,并使用MIME类型
'application/octet stream'
传输了它,使用的代码与您的几乎相同:
get :download do
data = File.open('binary_data').read
content_type 'application/octet-stream'
body data
end
我建议您的问题在于API客户端和/或字符编码(如Stuart M所建议的)。尽管到目前为止,我在讨论中发现的另一种可能性是,某些机架中间件被错误触发,并修改了Grape的输出。存在问题,已向Grape github页面报告。
它们与返回二进制文件和重写内容类型相关
要像这样返回二进制格式,请执行以下操作:
get '/download_file' do
content_type "application/octet-stream"
header['Content-Disposition'] = "attachment; filename=yourfilename"
env['api.format'] = :binary
File.open(your_file_path).read
end
与使用ActionController的请求的输出相比,您是否看到返回的
内容类型
HTTP头有什么不同?它们有不同的字符集吗?当你在问题中比较API和浏览器时,实际上是“API客户端加API路由”还是“浏览器加ActionController路由”?您有四种可能的组合,不清楚您有哪些问题-根据您的描述,问题是否真的存在于您的测试API客户机中?对。为了澄清,为了测试GrapeAPI,我使用curl/wget作为客户端,使用/download_文件作为端点。为了测试ActionController,我使用firefox浏览器和/键作为端点。换句话说,端点是不同的,但我希望在两个端点上获得相同的行为。我检查了两个标题。浏览器/键响应标题具有“text/html”;charset=utf-8'作为内容类型,而grape响应头的内容类型为'application/octet stream'。但是,将grape代码切换为返回“text/html”;charset=utf-8'未更改响应主体。我无法使用curl复制错误(即,我的答案中的代码与使用curl时预期的一样工作)。然而,我正在运行Grape mounted direct on rackup,不知道是否有Rails中间件在干扰您。您是否尝试过在没有Rails的情况下直接托管您的Grape服务来排除这种可能性?感谢大家的回复。我尝试切换grape端点以返回与send_数据相同的字符编码;然而,我没有看到反应机构有任何变化。我正在考虑切换ActionController和Grape端点代码以返回Base64编码的字符串,以确保两个用例的行为相同。我怀疑数据需要在此处进行force_编码。如果您可以在一个简单的Grape应用程序中复制此内容,请将其显示在Grape邮件列表中。为了安全起见,您可能还需要使用File.binread(您的文件路径)
。