2010-12-23 40 views
4

我在寫一個基於Pylons的下載網關。網關的客戶端將通過ID地址的文件:如何使用Pylons提供大文件?

/file_gw/download/1 

在內部,文件本身是通過HTTP從內部文件服務器訪問:

http://internal-srv/path/to/file_1.content 

該文件可能是相當大的,所以我想流內容。我存儲有關文件元數據在StoredFile模型對象:

class StoredFile(Base): 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    size = Column(Integer) 
    content_type = Column(String) 
    url = Column(String) 

鑑於此,什麼是最好的(即:大多數架構上的聲音,高性能等)的方式來寫我file_gw控制器?

回答

0

架構最健全的方法是讓控制器重定向到Amazon S3以下載文件並將文件存儲在Amazon S3上。

+0

假設有一個商業案例需要將內容存儲在本地。 S3不在了。 – 2010-12-23 18:01:31

2

你需要避免的一件事是在將第一個字節返回給客戶端之前將整個文件加載到內存中。在wsgi中,您可以返回響應正文的迭代器。 webob文檔有一個example這個,你應該可以在你的控制器中工作。畢竟,塔架使用webob。

這樣做的總體效果是客戶端立即得到反饋,即文件正在下載,但返回第一個塊需要很長時間。

您可能還想看看MongoDB的GridFS實現,這是一個非常好的方式來獲取分佈式文件系統,一旦讀取多個類型的文件操作,就可以優化寫入。

如果你必須自己做,這兩件事的結合將是一個很好的開始。