2010-09-15 60 views
0

我是新來的紅寶石和rails,所以請原諒我的問題......。 我想知道的是,如何在沒有將文件保存到我的Rails應用程序硬盤(將filedata直接傳輸到客戶端)的情況下使用ruby從ftp服務器獲取文件。我正在使用ruby Net/FTP類。Ruby-Rails直接向客戶端提供ftp文件

與淨/ FTP類我有下面的代碼片段的方法 「retrbinary」:

ftp.retrbinary('RETR ' + filename, 4096) { |data| 
    buf << data 
} 

在我的rails查看我可以做這樣的事情:

send_data(buf)

所以我如何結合這兩個。我不知道如何實例化一個緩衝區對象,填充流並將其提供給用戶。有沒有人有一個想法如何做到這一點?

+0

另外:歡迎計算器!記得投票贊成有用的答案,並標記最能回答你問題的答案。 – 2010-09-16 14:04:34

回答

1

你想要以下嗎?

1)客戶端(瀏覽器)發送到Rails服務器

2)服務器應與位於一個ftp服務器上的一個文件的內容作出響應的請求。

是嗎?

如果是這樣,那麼只需將瀏覽器重定向到ftp位置即可。例如

# in controller 
ftp_url = "ftp://someserver.com/dir_name/file_name.txt 
redirect_to ftp_url 

上述工作如果ftp文件具有匿名獲取訪問權限。

如果你真的需要從服務器訪問文件和流,請嘗試以下操作:

# in controller 
render :text => proc {|response, output| 
    ftp_session = FTP.open(host, user, passwd, acct) 
    ftp_session.gettextfile(remotefile) {|data| output.write(data)} 
    ftp_session.close 
    } 

您應該檢查頭在響應,看看他們是否是你想要的東西。

ps。從第二臺服務器設置ftp連接和流式傳輸可能會相對較慢。我會用JS向用戶顯示一個忙碌的圖形。

我想嘗試替代ftp。你可以設置NFS連接或掛載遠程磁盤嗎?會比ftp快得多。還要研究大的TCP窗口大小。

2

非常感謝您的支持!你的文章讓我繼續。喝了一杯咖啡後,我找到了一個工作解決方案。其實我正在做以下,這對我很有用:

def download_file 
    filename = params[:file] 
    raw = StringIO.new('') 
    @ftp.retrbinary('RETR ' + filename, 4096) { |data| 
    raw << data 
    } 
    @ftp.close 
    raw.rewind 
    send_data raw.read, :filename => filename 
end 

我會測試這在生產(現實生活中的情況)。如果這不夠好,我必須使用NFS掛載。