web-dev-qa-db-ja.com

Rails send_data from AJAX postでダウンロードをトリガーする方法

_send_data_を使用して、ajaxPOSTリクエストへの応答としてPNG画像を返そうとしています。成功コールバックでブラウザにダウンロードをトリガーさせるにはどうすればよいですか?

詳細

canvas.toDataURL()を使用して大きなbase64イメージを生成し、それをRails(v3.2.6)。Railsにデコードして、バイナリPNG、および画像をクライアントに送り返します。

_send_file_も試しましたが、同じ問題があります。

その他のオプション

  1. イメージクライアント側のダウンロード:(1) Safariが大きなbase64 URLでクラッシュする 、および(2)のため、これを行うことはできません。 ) Safariはまだアンカータグのダウンロード属性をサポートしていません ダウンロードした画像のファイル名を指定する必要があります。

  2. _$.get_の代わりに_$.post_を使用してください:canvas.toDataURL()を送信する必要があるため、これを行うことはできませんサーバーへのリクエストで。 GETリクエストURIにはサイズ制限があります。

24
mayatron

コントローラで関数を作成する

def ajax_download
  send_file "path_to_file/" + params[:file]
end

そしてコントローラーアクションで

respond_to do |format|
  @Java_url = "/home/ajax_download?file=#{file_name}"
  format.js {render :partial => "downloadFile"}
end

_downloadFile.js.erbを使用してビューフォルダー名の一部を作成し、この行を記述します

window.location.href = "<%=@Java_url %>"
22
Asnad Atta

JSからディスクにファイルをダウンロードすることはできません。これはセキュリティ上の懸念事項です。良い回避策については、以下のブログ投稿を参照してください。

http://johnculviner.com/post/2012/03/22/Ajax-like-feature-rich-file-downloads-with-jQuery-File-Download.aspx

3
kelf

行うnot受け入れられた回答をコピーして貼り付けるだけです。これは、過小評価できない大規模なセキュリティリスクです。テクニックは巧妙ですが、誰でも入力できるパラメータに基づいてファイルを配信すると、誰もが想像できるあらゆるファイルにアクセスできます。

同じ手法を使用するためのより安全な方法の例を次に示します。 APIトークンを持っているユーザーがログインしていることを前提としていますが、独自のシナリオに適応できるはずです。

アクションで:

current_user.pending_download = file_name
current_user.save!
respond_to do |format|
  @Java_url = "/ajax_download?token=#{current_user.api_token}"
  format.js {render :partial => "downloadFile"}
end

コントローラで関数を作成します

def ajax_download
  if params[:token] == current_user.api_token
    send_file "path_to_file/" + current_user.pending_download
    current_user.pending_download = ''
    current_user.save!
  else
    redirect_to root_path, notice: "Unauthorized"
  end
end

_downloadFile.js.erbを使用してビューフォルダー名の一部を作成します

window.location.href = "<%=@Java_url %>"

そしてもちろん、/ajax_downloadroutes.rbを指すルートが必要になります

get 'ajax_download', to: 'controller#ajax_download'
0
AFOC