2014-07-21 8 views
1

저는 현재 RoR 4.1.1을 사용하여 제 자신의 응용 프로그램을 개발 중입니다.레일스의 데이터베이스에서 바이너리 파일을 다운로드하는 방법은 무엇입니까?

내 목표는 .zip 파일을 저장할 플랫폼을 만드는 것이며 사용자가 해당 파일을 다운로드 할 수있게하고 싶습니다. 문제는 상사가 파일을 파일 시스템이 아닌 데이터베이스에 직접 저장하기를 원한다는 것입니다.

그러므로 내 ItemsController에서 이런 짓을 :

def create 
@item = Item.new(item_params) 
@item.file = params[:item][:file].read 
if @item.save 
    redirect_to @item 
else 
    render 'new' 
end 

end 

그리고 내 new.html.erb보기이 :

<%= f.label :application %> 
<%= f.file_field :file %> 
    <p> 
<%= f.submit %> 
</p> 

이 예상되는 내 DB에 물건을 업로드 할 날 수 있도록 .

이제 이진 파일이 포함 된 데이터베이스에 파일 열이 있습니다. 하지만 어떻게 다운로드받을 수 있습니까?

답변

2

send_data 컨트롤러 방법을 사용하여 다운로드를 시작할 수 있습니다. 여기 문서 :

link_to 'Download', item_download_path(@item), disable_with: 'Downloading...' 

이제 컨트롤러가 시작 : 항목에 대한 링크를 사용자에게

get '/items/:id/download', as: :item_download 

그리고 제공 : http://api.rubyonrails.org/classes/ActionController/DataStreaming.html#method-i-send_data

은 그래서 당신이 당신의 다운로드 행동에 대한 경로를 생성 가정 해 봅시다 사용자에게 다운로드 :

def download 
    item = Item.find params[:id] 

    send_data item.file, filename: item.name, type: 'zip', disposition: 'attachment' 
end 

사용자가 Download 링크가 회색으로 바뀌어 Downloading...으로 변경되면 브라우저가 다운로드 대화 상자를 열고 zip 파일 다운로드를 시작합니다.

참고 : 귀하의 item에는 name 방법이 있다고 가정했으나 원하는대로 할 수 있습니다. 중요한 옵션은 type: 'zip', disposition: 'attachment'입니다. 형식은 파일 형식이며 브라우저가 현재 상태를 알 수 있도록 도와주고 브라우저가 파일을 다운로드하거나 페이지에서 렌더링하기위한 것입니다. 예를 들어, PDF 파일을 다운로드하는 경우 disposition: 'inline'을 전달하면 브라우저에서 직접 다운로드하지 않고 pdf 파일을 표시합니다.

+0

대단히 감사합니다. 그것은 트릭을 완벽하게 해냈다! – R0bur

+0

이것은 정확히 내가 필요로했던 것입니다 - 감사합니다! – kales33

관련 문제