prosource

AJAX post에서 Rails send_data로 다운로드를 트리거하는 방법

probook 2023. 10. 30. 21:04
반응형

AJAX post에서 Rails send_data로 다운로드를 트리거하는 방법

사용하려고 합니다.send_data아약스 포스트 요청에 대한 응답으로 PNG 이미지를 반환합니다.성공 콜백 시 브라우저가 다운로드를 트리거하도록 하려면 어떻게 해야 합니까?

세부 사항

큰 base64 이미지를 생성하고 있습니다.canvas.toDataURL(), 그런 다음 레일즈에게 게시합니다(v3.2.6).레일스는 이를 이진 PNG로 디코딩하고 이미지를 클라이언트로 다시 보냅니다.

저도 노력했습니다.send_file하지만 똑같은 문제를 가지고 있습니다.

기타옵션

  1. 이미지 클라이언트 쪽 다운로드:(1) Safari가 base64 URL에서 충돌하고, (2) Safari가 다운로드된 이미지 파일 이름을 지정해야 하는 앵커 태그에서 다운로드 속성을 아직 지원하지 않기 때문에 이 작업을 수행할 수 없습니다.

  2. 대신 a를 사용합니다 : 우리는 우리의 것을 보내야 하기 때문에 이것을 할 수 없습니다.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에서는 디스크에 파일을 다운로드 할 수 없습니다.보안 문제입니다.좋은 해결 방법은 아래 블로그 게시물을 참조하세요.

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

승인된 답변을 복사해서 붙여넣기만 하면 안 됩니다.그것은 아무리 과장해도 지나칠 수 없는 엄청난 보안 위험입니다.기술은 뛰어나지만 누구나 입력할 수 있는 매개 변수를 기반으로 파일을 전송하면 누구나 상상할 수 있는 모든 파일에 액세스할 수 있습니다.

여기에 동일한 기술을 사용하는 보다 안전한 방법의 예가 있습니다.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'

언급URL : https://stackoverflow.com/questions/16242359/how-to-trigger-download-with-rails-send-data-from-ajax-post

반응형