我如何从提交的链接下载文件然后重新上载到我的服务器进行流式传输?

时间:2010-09-10 20:36:33

标签: python django file-upload download amazon-s3

我正在开展一个项目,用户可以通过表单提交指向其他网站上托管的声音文件的链接。我想将该文件下载到我的服务器并使其可用于流式传输。我可能需要将其上传到Amazon S3。我在Django做这个,但我是Python的新手。任何人都可以指出我正确的方向如何做到这一点?

1 个答案:

答案 0 :(得分:0)

我将如何做到这一点:

  1. 创建像SoundUpload这样的模型,如:

    class SoundUpload(models.Model):
        STATUS_CHOICES = (
            (0, 'Unprocessed'),
            (1, 'Ready'),
            (2, 'Bad File'),
        )
        uploaded_by = models.ForeignKey(User)
        original_url = models.URLField(verify_true=False)
        download_url = models.URLField(null=True, blank=True)
        status = models.IntegerField(choices=STATUS_CHOICES, default=0)
    
  2. 接下来创建一个带有ModelForm的视图,并将信息保存到数据库中。

  3. SoundUpload模型上追加post-save signal django-celery Task。这将确保UI在您处理所有数据时做出响应。

    def process_new_sound_upload(sender, **kwargs):
       # Bury to prevent circular dependency issues.
       from your_project.tasks import ProcessSoundUploadTask
       if kwargs.get('created', False):
            instance = kwargs.get('instance')
            ProcessSoundUploadTask.delay(instance.id)
    
    post_save.connect(process_new_sound_upload, sender=SoundUpload)
    
  4. ProcessSoundUploadTask任务中,您需要:

    • 根据传入的id。
    • 查找模型对象
    • 使用pycurl将文件下载到临时文件夹(具有非常有限的权限)。
    • 使用ffmpeg(或类似)确保它是真实的声音文件。在此处执行任何其他病毒样式检查(取决于您对用户的信任程度)。如果结果是错误文件,请将SoundUpload。状态字段设置为2(错误文件),保存并返回以停止处理任务。也许可以在这里发送电子邮件。

    • 使用boto将文件上传到s3。请参阅this示例。

    • SoundUpload。download_url更新为s3网址,状态为“已处理”并保存对象。
    • 进行任何其他后处理(发送通知电子邮件等)
  5. 这种方法的关键是使用django-celery。一旦任务通过post_save信号启动,UI就可以返回,从而创建一个非常“活泼”的体验。此任务放在AMQP消息队列中,可以由多个工作人员(专用EC2实例等)处理,因此您可以毫不费力地扩展。这看起来有点矫枉过正,但实际上并没有看起来那么多。