2017-05-17 2 views
0

케말에 this answer을 구현하고 싶습니다. 케말로 HTTP 응답 헤더 설정하기

require "kemal" 

#... 

get "/map.pdf" do |env| 
    env.response.headers["Content-Type"] = "application/pdf" 
    env.response.headers["Content-Disposition"] = %(inline;filename="myfile.pdf") 
end 

Kemal.run 

내가 브라우저 (파이어 폭스)에서 localhost:3000/map.pdf를 열어 내 코드를 테스트

, 그것을 다운로드하라는 메시지가 나타납니다 :

내 현재 설정은 app/public/map.pdf에서 PDF 파일 및 내 주요 결정 파일에 다음과 같은 코드가 있습니다 파일 (내가 그것을 표시하려고 시도하는 동안). 그리고 다음에 curl -I 결과 :

내가 Content-Type: application/pdf을 볼 수 있도록 노력하겠습니다 것
HTTP/1.1 200 OK 
Connection: keep-alive 
X-Powered-By: Kemal 
Content-Type: application/octet-stream 
ETag: W/"1494983019" 
Content-Length: 1170498 

.

+0

안녕하세요! 첫째, http://stackoverflow.com/questions/20508788/do-i-need-content-type-application-octet-stream-for-file-download 이 도움이 될 수 있습니다. 둘째, 실제 질문은 무엇입니까? –

+0

방금 ​​코드를 시도했지만 제대로 작동했습니다. 서버를 중지하고 응용 프로그램을 다시 컴파일 하시겠습니까? 다시 컴파일하지 않고 변경하면 효과가 없습니다. – asterite

답변

-2

여기서 Content-Type : application/pdf를 볼 수 있습니다.

요점은 Content-Disposition이 헤더로 존재하지 않는다는 것입니다. 어쩌면 어떤 이유로 든 헤더를 보내지 않을 수도 있습니다.

예를 들어 PHP에서 헤더가 전송되기 전에 스크립트가 단일 바이트를 출력하면 헤더가 전송되지 않습니다. 첫 번째 출력 전에 헤더 만. 일부 데이터를 보낸 후에 http 헤더를 설정하면 헤더가 무시됩니다. 헤더를 확인하는 경우 여기

+0

두 번째 단락에서 무엇을 말하려고하는지 잘 모르겠습니다. – Jones

+0

이 질문에 어떻게 답할 수 있습니까? 미안하지만, 전혀 그렇지 않다고 생각합니다. –

2

케말 저자,

당신은 send_file 함께 갈 수 있어야한다. 그러나 경로 이름과 파일이 동일하지 않은지 확인하십시오. 이 경우 경로는 /pdf

get "/pdf" do |env| 
    env.response.headers["Content-Type"] = "application/pdf" 
    env.response.headers["Content-Disposition"] = %(inline;filename="map.pdf") 
    send_file env, "./public/map.pdf" 
end 
+0

이러한 변경 사항을 통해 여전히 다운로드하라는 메시지를 표시하고 content-type은 'Content-Type : text/html'이 아닙니다. – Jones