Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何允许使用grapeapi下载二进制文件_Ruby On Rails_Ruby_Api_Actioncontroller_Grape Api - Fatal编程技术网

Ruby on rails 如何允许使用grapeapi下载二进制文件

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,

我想允许使用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,
            :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(您的文件路径)