繁体   English   中英

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

[英]How would I go about downloading a file from a submitted link then reuploading to my server for streaming?

我正在一个项目中,用户可以通过表单提交指向另一个站点上托管的声音文件的链接。 我想将该文件下载到我的服务器上,并使其可用于流式传输。 我可能必须将其上传到Amazon S3。 我在Django中进行此操作,但是我是Python新手。 谁能指出我正确的方向呢?

这是我的处理方式:

  1. 创建一个类似SoundUpload的模型,如下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. django-celery TaskSoundUpload模型上挂钩一个保存后的信号 这将确保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 .status字段设置为2 (错误文件),将其保存,然后返回以停止处理任务。 也许在这里发送电子邮件。

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

    • SoundUpload .download_url更新为s3 url,状态为“已处理”并保存对象。
    • 进行其他任何后处理(发送通知电子邮件等)

这种方法的关键是使用django-celery 通过post_save信号启动任务后,UI可以返回,从而创造出非常“诱人”的体验。 该任务被放入一个AMQP消息队列中,该队列可以由多个工作程序(专用的EC2实例等)处理,因此您可以进行扩展而不会遇到太多麻烦。 这似乎有点过大,但实际上并没有看起来那么多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM