如何使用GRAPE API允许二进制文件下载

我想允许使用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下载的同一文件

有问题#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 

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

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

我建议你的问题是API客户端和/或字符编码(正如Stuart M所建议的那样)。 虽然到目前为止我发生的另一种可能性是形成了一些Rack中间件被错误地触发,并且修改了Grape的输出。