我正在使用此文件存储引擎在上传文件时将文件存储到Amazon S3:
http://code.welldev.org/django-storages/wiki/Home
上传需要相当长的时间,因为在将响应返回给客户端之前,必须先将文件从客户端上载到Web服务器,然后再将Web服务器上载到Amazon S3.
我想将文件发送到S3异步的过程,因此响应可以更快地返回给用户.使用文件存储引擎执行此操作的最佳方法是什么?
谢谢你的建议!
我采取了另一种解决这个问题的方法.
我的模型有2个文件字段,一个使用标准文件存储后端,另一个使用s3文件存储后端.当用户上传文件时,它会被存储在本地.
我的应用程序中有一个管理命令,它将所有localy存储的文件上传到s3并更新模型.
因此,当请求文件时,我检查模型对象是否使用s3存储字段,如果是,我将重定向发送到s3上的正确URL,如果不是,我发送重定向,以便nginx可以从磁盘提供文件.
这个管理命令可以由任何事件cronjob或其他事件触发.
您可以让用户使用特殊表单(在隐藏字段中使用加密的策略文档)从浏览器直接将文件上载到S3.上传完成后,它们将重定向回您的应用程序.
更多信息:http://developer.amazonwebservices.com/connect/entry.jspa?externalID = 1434
有一个应用程序:-)
https://github.com/jezdez/django-queued-storage
它完全符合您的需求 - 更重要的是,因为您可以设置任何"本地"存储和任何"远程"存储.此应用程序将您的文件存储在快速"本地"存储(例如MogileFS存储)中,然后使用Celery(django-celery),将尝试异步上载到"远程"存储.
几句话:
棘手的是 - 您可以将其设置为复制和上传,或上传和删除策略,一旦上传后将删除本地文件.
第二个棘手的事情 - 它将从"本地"存储服务文件,直到它没有上传.
它还可以配置为在上载失败时进行重试次数.
安装和使用也非常简单明了:
pip install django-queued-storage
附加到INSTALLED_APPS
:
INSTALLED_APPS += ('queued_storage',)
在models.py
:
from queued_storage.backends import QueuedStorage queued_s3storage = QueuedStorage( 'django.core.files.storage.FileSystemStorage', 'storages.backends.s3boto.S3BotoStorage', task='queued_storage.tasks.TransferAndDelete') class MyModel(models.Model): my_file = models.FileField(upload_to='files', storage=queued_s3storage)
你可以解耦这个过程:
用户选择要上载的文件并将其发送到您的服务器.在此之后,他看到一个页面"感谢您上传foofile.txt,它现在存储在我们的存储后端"
当用户上传文件时,它将在您的服务器上存储临时目录,如果需要,一些元数据将存储在您的数据库中.
然后,服务器上的后台进程会将文件上载到S3.只有在您拥有对服务器的完全访问权限以便您可以为此创建某种"deamon"(或者只是使用cronjob)时,才可能这样做.*
显示的页面异步轮询并向用户显示某种进度条(或简单的"请等待"消息.仅当用户应该能够"使用"(将其放入消息中,或者这样的东西)它上传后直接.
[*:如果您只有一个共享主机,您可以构建一些解决方案,在用户浏览器中使用隐藏的Iframe来启动脚本,然后将文件上传到S3]