我在django中创建了一个视频共享网站。
目前,如果用户注册并上传视频,则会将其上传到media/vid/uploaded-vid
。然后我使用ffmpeg转换为flv。我想做的是:
使用 alex1 用户名注册的人,我想在确认他的电子邮件时为他创建一个目录,名为/media/vid/members-vid/alex1
如果他上传了视频,则会将其转换为media/vid/uploaded-vid
中的flv,然后复制到/media/vid/members-vid/alex1
。并且应删除media/vid/uploaded-vid
中的视频。
我想保证/media/vid/
。你如何保护django目录?或者只是一个apache chmod
?
我想知道我是否可以使用celery / rabbitqm将文件从一个文件夹复制到另一个文件夹,或创建新文件夹..
答案 0 :(得分:5)
为避免有人上传shell或其他恶意代码,您不应将访问上传的文件授予外部客户端。因此,用户上传文件,而不是芹菜获取该文件并对其进行处理,将结果放入另一个Web服务器可访问路径。如果处理失败(即文件不是有效视频),则没有人可以访问它。但是通过正确的网络服务器设置(即拒绝从可用于上传的位置运行任何脚本),无论如何都应该没有大问题。
为了避免用户看到其他人的私人文件,您还可以将文件放在网站的媒体文件之外,并使用django的视图来检查访问权限+特殊的webserver指令,以实际服务文件而不通过Django代理它。这些指令对于不同的服务器是不同的:
答案 1 :(得分:3)
您对保留目录的使用似乎很好。但是,以用户命名的目录存在风险(如果某人提供的名称是可执行命令名称会怎样?),因此使用用户ID可能会更好。实际上,如果您将拥有大量用户,您可能需要考虑在一些常规目录下拆分用户目录,以便更容易查找目录以进行管理,并且因为某些文件系统对目录下的条目数有相当低的限制 - 例如ext3允许大约32K条目。
例如,对于以这些数字开头的子目录,外部目录名为1到9的原始用户目录方案将为您提供更多的灵活性。
因此,假设您已将上传的文件放在/tmp/upload/1015/
中,并且您希望将它们移至/var/userdata/01/1015/
并处理/var/userdata/01/1015/
中的文件,则以下内容可能是明智之举:
/tmp/upload/1015/
需要是apache用户或组可写/tmp/upload/1015/
文件,AMMP调度服务(如RabbitMQ)或RPC / Web服务调用/tmp/upload
中超过24小时的文件) 根据您的需要,该列表显然会持续一段时间。最后,您将拥有一个用户目录,其中的文件可由apache读取,但不能由apache用户写入。如果您的服务增长,您可以将此服务的视频处理组件移动到另一台服务器。
顺便说一下,Flickr的Cal Henderson在他的O'Reilly书“Building Scalable Web Sites”中有一个非常好的描述如何做(非常简单)。它写于2006年,但他的方法令人耳目一新,直截了当。
答案 2 :(得分:1)
您可以将视频存储在mongoDB GridFS或类似内容中。因此,您不会遇到目录,存储,可执行文件......