AJAX post에서 Rails send_data로 다운로드를 트리거하는 방법
사용하려고 합니다.send_data
아약스 포스트 요청에 대한 응답으로 PNG 이미지를 반환합니다.성공 콜백 시 브라우저가 다운로드를 트리거하도록 하려면 어떻게 해야 합니까?
세부 사항
큰 base64 이미지를 생성하고 있습니다.canvas.toDataURL()
, 그런 다음 레일즈에게 게시합니다(v3.2.6).레일스는 이를 이진 PNG로 디코딩하고 이미지를 클라이언트로 다시 보냅니다.
저도 노력했습니다.send_file
하지만 똑같은 문제를 가지고 있습니다.
기타옵션
이미지 클라이언트 쪽 다운로드:(1) Safari가 큰 base64 URL에서 충돌하고, (2) Safari가 다운로드된 이미지 파일 이름을 지정해야 하는 앵커 태그에서 다운로드 속성을 아직 지원하지 않기 때문에 이 작업을 수행할 수 없습니다.
대신 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에서는 디스크에 파일을 다운로드 할 수 없습니다.보안 문제입니다.좋은 해결 방법은 아래 블로그 게시물을 참조하세요.
승인된 답변을 복사해서 붙여넣기만 하면 안 됩니다.그것은 아무리 과장해도 지나칠 수 없는 엄청난 보안 위험입니다.기술은 뛰어나지만 누구나 입력할 수 있는 매개 변수를 기반으로 파일을 전송하면 누구나 상상할 수 있는 모든 파일에 액세스할 수 있습니다.
여기에 동일한 기술을 사용하는 보다 안전한 방법의 예가 있습니다.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
'prosource' 카테고리의 다른 글
오라클 With C#의 1,000만 개 이상의 레코드 목록 작성 (0) | 2023.10.30 |
---|---|
SQL에서 RavenDB Northwind 가져오기 - employee_privilege에 컬렉션이 주어지지 않은 이유는 무엇입니까? (0) | 2023.10.30 |
Oracle Sql 개발자 오류: 일부 모듈을 설치할 수 없습니다. (0) | 2023.10.30 |
실용적인 자바스크립트 객체 지향 디자인 패턴의 예 (0) | 2023.10.30 |
JDB를 이용하여 지도 데이터를 가져오는 방법CT 템플릿.queryForMap (0) | 2023.10.30 |