_send_data
_を使用して、ajaxPOSTリクエストへの応答としてPNG画像を返そうとしています。成功コールバックでブラウザにダウンロードをトリガーさせるにはどうすればよいですか?
canvas.toDataURL()
を使用して大きなbase64イメージを生成し、それをRails(v3.2.6)。Railsにデコードして、バイナリPNG、および画像をクライアントに送り返します。
_send_file
_も試しましたが、同じ問題があります。
イメージクライアント側のダウンロード:(1) Safariが大きなbase64 URLでクラッシュする 、および(2)のため、これを行うことはできません。 ) Safariはまだアンカータグのダウンロード属性をサポートしていません ダウンロードした画像のファイル名を指定する必要があります。
_$.get
_の代わりに_$.post
_を使用してください:canvas.toDataURL()
を送信する必要があるため、これを行うことはできませんサーバーへのリクエストで。 GET
リクエストURIにはサイズ制限があります。
コントローラで関数を作成する
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 %>"
JSからディスクにファイルをダウンロードすることはできません。これはセキュリティ上の懸念事項です。良い回避策については、以下のブログ投稿を参照してください。
行う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_download
のroutes.rb
を指すルートが必要になります
get 'ajax_download', to: 'controller#ajax_download'