2010-12-23 90 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实现,这是一个非常好的方式来获取分布式文件系统,一旦读取多个类型的文件操作,就可以优化写入。

如果你必须自己做,这两件事的结合将是一个很好的开始。

相关问题