2014-07-24 73 views
1

我正在用rails 4开发一个web应用程序,我目前面临一个小问题。允许客户端从ftp rails下载文件

我想让网站的用户能够通过单击链接从ftp下载文件。我决定去这个:

def download 

    @item=Item.find(params[:id]) 
    @item.dl_count += 1 
    @item.save 
    url = @item.file_url.to_s  
    redirect_to url and return 

end 

而且,很基本,这在我看来:

<%= link_to 'DL', controller: "items", action: "download"%> 

不过,我不是这个相当满意,因为它会产生一些错误就像点击链接创建两个GET方法,一个通过403 Forbidden响应,另一个响应302找到...

您是否有任何关于如何改善此问题的想法?

+0

由用户(IE是动态的),上传的文件,或者是他们静态的?如果它们是静态的,那么你肯定可以把它们放在'/ public'文件夹中,以便普通用户可以访问它们? –

+0

他们是动态的。我选择FTP托管的原因是因为我想在Heroku上部署我的应用程序,所以无法免费创建文件系统。 – R0bur

回答

1

在Rails中你应该做的:

def download 
    @item=Item.find(params[:id]) 
    @item.dl_count += 1 
    @item.save 
    url = @item.file_url.to_s  
    send_file url, type: 'image/jpeg', disposition: 'inline' 
end 

看看以了解更多信息http://apidock.com/rails/ActionController/DataStreaming/send_file

注意,由send_file可以从本地文件系统只发送。

如果你需要从远程源文件(应该是安全的地点),如http://example.com/apps/uploads/tfm.zip和避免储存在服务器内存中这个文件,你可以先保存在#文件{RAILS_ROOT}/TMP /或系统的/ tmp目录,然后由send_file

data = open(url) 
filename = "#{RAILS_ROOT}/tmp/my_temp_file" 

File.open(filename, 'w') do |f| 
    f.write data.read 
end 

send_file filename, ...options... 

如果滑轨不能读文件,你应该检查文件权限

+0

我在尝试你所说的时出现这个错误:无法读取文件http://#addressofmytfp/apps/uploads/tfm.zip – R0bur

+0

@ R0bur检查答案更新 – KRol