10

我想允许使用 ruby​​ 的 Grape API 下载二进制文件(.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 下载的相同文件

4

2 回答 2

18

有问题#412#418已报告到葡萄 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
于 2013-11-11T04:02:28.867 回答
1

我认为您的 Grape 代码还可以,我使用浏览器和用于测试 API 的 Mac HTTP 工具(称为 GraphicalHTTPClient)测试了它的一个变体。我成功地从磁盘加载了一个二进制文件,并'application/octet-stream'使用与您的几乎相同的代码以 MIME 类型传输它:

  get :download do
    data = File.open('binary_data').read
    content_type 'application/octet-stream'
    body data
  end

我建议您的问题在于 API 客户端和/或字符编码(如 Stuart M 所建议)。尽管到目前为止我们讨论的另一种可能性是,一些 Rack 中间件被错误地触发,并修改了 Grape 的输出。

于 2013-05-20T09:12:21.507 回答