我想允许使用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下载的同一文件
答案 0 :(得分:14)
有问题#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
答案 1 :(得分:1)
我认为您的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的输出。