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 に答える