2011-12-05 5 views
6

코드를에 send_file 기능을 가진 파일을 읽을 수 없습니다 :내가 사용하고 레일 3

<%= link_to "Download", download_image_path(image) %> 

컨트롤러에서 : 나는 오류를 얻고있다

def download 
    @image = Image.find(params[:id]) 
    send_file "#{RAILS_ROOT}/public" + @image.attachment.url 
end 

: 뷰 파일에서

Cannot read file /Users/mohit/projects/my_app/public/system/attachments/4/original/Screen Shot 2011-11-04 at 3.14.03 PM.png?1320582022 

PS : 파일을 두 번 확인했습니다. 모든 해당 컨트롤러의 모든 파일 (이미지, pdf, 비디오)에 대해 서버에서 동일한 문제가 발생합니다.

답변

15

문제였다 : 나는

@image = Image.find(params[:id]) 
send_file "#{RAILS_ROOT}/public" + @image.attachment.url 

을 사용했다

@image = Image.find(params[:id]) 
send_file @image.attachment.path 

PS해야한다 : 그 이미지/기록이 존재의 유효성을 검사해야합니다.

+0

brakeman을 사용하여 코드를 분석하면 파일 이름으로 사용 된 MOdel 속성으로 오류가 표시됩니다. 그냥 제동을하십시오. 그것의 고려 사항 send_file Image.find (params [: id]). uploaded_file.path – errakeshpd

0

?1320582022은 파일 이름에 속합니까? 파일 이름의 공백에 대해 잘 모르겠다. 아마도 이스케이프해야 할 수도있다.

+0

화면 PM.png 파일 이름이고 1,320,582,022 개발 모드에서 문제를 받고 원인 메신저오고 3.14.03에서 2011-11-04 샷 .. –

1

나는 당신이 이미지 첨부 파일 URL을 저장하는 방법을 모르겠지만, 일반적으로 파일 이름은 좋아한다 : "xxxxx는"그것은 결국이되지 않습니다

/Users/mohit/projects/my_app/public/system/attachments/4/original/Screen Shot 2011-11-04 at 3.14.03 PM.png 

알 수 있습니다.

파일 이름이 "Screen Shot 2011-11-04 at 3.14.03 PM.png"또는 "Screen Shot 2011-11-04 at 3.14.03 PM.png"인지 여부를 확인할 수 있습니다. 1320582022 ".

파일 URL의 경우 다음과 같이 입력하십시오 : http://example.com/xxx?dddd, "?" 경로와 매개 변수를 나눕니다. 문자열 "dddd"는 url 경로를 요청할 때 매개 변수입니다. 경로 또는 파일 이름의 일부가 아닙니다. 매개 변수는 로컬 파일 이름이 아닌 URL에서만 지원됩니다.

그래서 매개 변수와 파일 이름 만 제외해야하는 이미지 첨부 URL을 저장하는 코드를 확인해야한다고 생각합니다. 이름이 디스크에 저장된 파일과 정확히 일치하는지 확인하십시오.

그리고 직접 IRB하지만 파일을 열고 출력을 확인하기 위해 시도 할 수 있습니다 :

>>> irb 
irb> f = open('/Users/mohit/projects/my_app/public/system/attachments/4/original/Screen Shot 2011-11-04 at 3.14.03 PM.png?1320582022') 

다른 사람들은 send_file의 오류 위치를 찾으려고하고, 파일 이름을 확인합니다.

나는 아직도 문제가 무엇인지, 단지 몇 가지 제안을 확실히 할 수 없습니다.

+0

그건 좋은 제안 이었어 .. –

2

그냥 경로 URL 방법을 변경 :

send_file @image.attachment.path # this is the right way!. 
관련 문제